Ogni cosa ha una fine: incluso il tutorial per la compilazione nativa di GnuPG per Win32 usando MinGW/MSYS. Infatti ho preso una decisione: congelare definitivamente la pagina web del tutorial nello stato in cui è adesso (agosto 2015), e non operare più aggiornamenti. Le motivazioni alla base di questa decisione sono molteplici.
Questo tutorial infatti era nato in un contesto totalmente diverso da quello odierno. Era appena uscita la versione 1.0.7 di GnuPG, ma non erano stati rilasciati gli eseguibili per Windows. Si vociferava che non sarebbero più stati rilasciati eseguibili "ufficiali" per Windows, e che chi avesse voluto usare GnuPG sotto Windows avrebbe dovuto ricompilarselo da solo a partire dai sorgenti. Questa operazione non era affatto banale, la procedura ufficiale prevedeva l'uso di una macchina Linux e questo, per molte persone, voleva dire dover creare una partizione ad hoc sul disco rigido (sacrificando una parte rilevante del poco spazio a disposizione) e installarci stabilmente Linux. In questo contesto, si era tentata una strada alternativa: visto che esisteva un porting "minimale" per Windows di GCC (MinGW) e di alcune utility tipiche del mondo Linux (MSYS), usare queste versioni per compilare GnuPG direttamente sotto Windows, senza dover installare ex-novo un intero sistema operativo. Nacque così il tutorial.
In tutti questi anni, però, le cose sono molto cambiate. Tanto per cominciare il "pericolo" che si paventava con GnuPG 1.0.7 è rientrato, e vengono sempre rilasciati gli eseguibili ufficiali per Windows di tutte le versioni di GnuPG, rendendo la compilazione "casalinga" molto meno necessaria. Inoltre, il porting di GCC per Windows non è mai uscito da uno stato di "beta" perenne, con forti limitazioni rispetto alle corrispondenti versioni per Linux, rendendo tra l'altro l'installazione e l'uso di MinGW/MSYS non alla portata di tutti. Forse anche per questo (e per l'ovvia necessità di non complicare il codice a fronte di un beneficio praticamente nullo), la compilazione nativa sotto Windows non è mai stata supportata ufficialmente dal team di GnuPG, che ha continuato a preferire la cross-compilazione da Linux. Le cose si sono ulteriormente complicate con il rilascio del ramo 2.x di GnuPG. Tale versione è infatti molto diversa dalla serie 1.x e, come conseguenza, a causa delle limitazioni del porting di GCC sotto Windows, la compilazione nativa di GnuPG 2.x semplicemente allo stato attuale non è possibile (o lo è a prezzo di fatiche assolutamente non giustificabili). Un aggiornamento del tutorial per supportare GnuPG 2.x non è quindi praticabile.
Inoltre, oggi come oggi, la cross-compilazione da Linux è estremamente più semplice che in passato. Chiunque può scaricarsi un software per la creazione di macchine virtuali (tipo VirtualBox), farci girare dentro un Linux live, compilare GnuPG, e alla fine cancellare del tutto la macchina virtuale senza sprecare neanche un byte di spazio disco (anche se al giorno d'oggi, con i dischi che si misurano in Terabytes, questo non è più un problema). Di fatto, quella che al tempo era la strada più complessa, motivo per cui era nato il tutorial, oggi come oggi è decisamente la strada più semplice e immediata.
Quindi, penso che il tutorial ormai abbia assolto al suo compito e che sia tempo di mandarlo in pensione. La pagina rimarrà online come è adesso, come testimonianza "storica", e la versione è "fissata" a "1.0.0 FINAL".
Colgo l'occasione per ringraziare ancora una volta tutti gli amici che, sia sul NG it.comp.sicurezza.crittografia, che anche privatamente contattandomi per e-mail, si sono spesi per dare consigli, suggerimenti, fare test, ecc., per rendere la procedura di compilazione il più possibile semplice, chiara, ed efficace, e che sono ricordati nel preambolo del tutorial medesimo.
Questo testo descrive i passi necessari per compilare GnuPG per Win32 usando MinGW in maniera "nativa" sotto Windows, senza effettuare cross-compilazioni da Linux. Queste istruzioni si riferiscono a GnuPG 1.4.13 [lo so, alcune immagini riportano 1.4.0 o addirittura 1.2.6, ma sono troppo pigro per rifarle da capo ogni volta... ;-)], ma dovrebbero comunque funzionare, con qualche adattamento, anche con tutte le altre versioni della serie 1.x a partire dalla 1.2.0. Per le versioni future, dalla 1.5.0 compresa in poi, non posso ovviamente garantire nulla...
In teoria, con un'analoga procedura, dovrebbe essere possibile anche compilare GnuPG per Win64 usando mingw-w64. Purtroppo però, non avendo accesso a una macchina Win64, non mi è possibile testare la cosa, né descrivere in dettaglio la relativa procedura.
Ovviamente questa vuole essere solo la descrizione della procedura che io ho seguito per compilare GnuPG per Win32. Non è detto che in certi punti non si possa fare di meglio. Non è neanche detto che la procedura funzioni sui vostri computer così come ha funzionato sul mio e che non vi crei nessun problema. Tutto quello che posso dire è contenuto nel sottotitolo: seguendo questa procedura "a me ha compilato, a voi non so". Se trovate errori, omissioni e/o imprecisioni di qualunque genere all'interno di questo testo, non esitate a segnalarmeli.
Detto questo, se non siete più che sicuri di quello che fate e/o avete dei dubbi sulla correttezza del risultato ottenuto, il consiglio è di lasciare perdere le compilazioni "fatte in casa" ed usare i binari ufficiali presenti sul sito di GnuPG.
Se, invece, nonostante tutto, siete arrivati a leggere fin qui e volete provare, allora tirate un bel respiro, contante fino a 10, ripetete l'alfabeto ad alta voce al contrario (dalla "z" alla "a") un paio di volte, ripensateci di nuovo, e, se siete proprio decisi... beh... allora... qui sotto c'è scritto tutto quello che dovete fare!
Prima di cominciare, l'autore di questa pagina desidera ringraziare TJL73 che ha testato sulla sua macchina l'effettivo funzionamento della procedura qui descritta e la sua completezza. Il sottotitolo può quindi essere letto come un "a noi ha compilato, a voi non so"... ;-)
L'autore desidera ringraziare altresì Joe Vender e Maxine Brandt, per il loro aiuto nel risolvere i problemi di compatibilità tra GnuPG e le librerie esterne per Win32, Tom Pegios, per i suoi suggerimenti sulla semplicifazione della procedura di rimozione dei simboli di debug, sul collegamento statico di libcurl e sul possibile uso di mingw-w64, PIK, per avermi segnalato l'esistenza della versione TDM di GCC per MinGW e per varie discussioni sulle possibili opzioni da passare a GCC per ottimizzare meglio il codice per diverse architetture, e Michel Nallino aka WinTerMiNator che, oltre a curare la versione francese della pagina, ha dato moltissimi suggerimenti per renderne più chiaro e completo il contenuto anche nelle altre lingue... ;-)
Eccovi le istruzioni. In bocca al lupo e non dite che non vi ho avvertito... ;-)
1.1) Collegatevi al sito http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/ e scaricate l'ultima versione del programma di installazione (la 20111118 nel momento in cui scrivo).
1.2) Avviate la procedura di installazione, facendo attenzione a impostare come directory di destinazione una cartella senza spazi nel nome (il default "C:\MinGW" va benissimo). Quando vi viene richiesto quali "Repository catalogues" usare, selezionate "Download latest repository catalogues", così sarete sicuri di avere la versione più recente dei pacchetti di MinGW.
1.3) Al momento di scegliere che pacchetti installare, sappiate che per compilare GnuPG bastano il "C Compiler" e il "MSYS Basic System". Nulla vi vieta di installare anche altri pacchetti, comunque.
1.4) Ora potete lanciare "MinGW Shell" con l'apposita icona nel menù avvio.
1.5) Scrivete al prompt di MinGW "gcc -v" e premete invio. Se vi appaiono messaggi simili a quelli che vedete in questa figura:
allora congratulazioni: GCC funziona!
1.6) Se desiderate che GnuPG supporti altre lingue oltre all'inglese, dovete scaricare e installare i due pacchetti aggiuntivi "libiconv" e "gettext" di MinGW. Inoltre, se desiderate poter eseguire i check per testare la copia di GnuPG appena compilata, dovete scaricare e installare il pacchetto aggiuntivo "msys-coreutils". Scrivete pertanto al prompt di MinGW il seguente comando "mingw-get install libiconv gettext msys-coreutils" (limitando eventualmente la lista ai soli pacchetti che volete installare) e premete invio. La procedura dovrebbe automaticamente scaricare e installare i file richiesti.
Prima di cominciare la compilazione, è necessario fare un minimo adattamento ai sorgenti di GnuPG se desiderate poter eseguire i check.
2.1) Se non lo avete già fatto, scaricate i sorgenti di GnuPG 1.4.13 (ovviamente da http://www.gnupg.org). Nella cartella in cui è stato installato MinGW, c'è una sottocartella "msys" al cui interno si trova una ulteriore cartella "1.0" al cui interno si trova una ulteriore cartella "home" al cui interno si trova una ulteriore cartella il cui nome è il vostro nome utente sotto Windows. Al suo interno dovete scompattare i sorgenti di GnuPG, mantenendo la struttura delle directory presente nel file compresso. Se tutto va bene, vi ritroverete con una ulteriore sottocartella chiamata "gnupg-1.4.13" con tutti i sorgenti al suo interno.
2.2) Per poter eseguire i check, aprite ora il file "seat.test" nella sottocartella "checks" e portatevi alla linea 9.
Modificate "$i y" in "z y" e aggiungete subito prima di essa due nuove linee con i seguenti comandi: "cp $i z" e "unix2dos z". Salvate e chiudete il file.
2.3) Se lo desiderate, e SOLAMENTE se siete BEN consapevoli di quello che state facendo, potete fare una piccola modifica ai sorgenti di GnuPG per abilitare la creazione di chiavi di dimensione superiore a 4096 bit. Tali chiavi possono infatti essere utilizzate senza problemi da GnuPG, ma la loro creazione è di default disabilitata. Secondo le linee guida del NIST, la sicurezza equivalente a quella di un algoritmo simmetrico con chiave di 128 bit (come AES-128) è data da una chiave RSA di lunghezza pari a 3072 bit, mentre la sicurezza equivalente a quella di un algoritmo simmetrico con chiave da 256 bit (come AES-256) è data da una chiave RSA di lunghezza pari a circa 15000 bit. A tale proposito si veda anche questa voce di Wikipedia. In altre parole, se si usano algoritmi simmetrici da 128 bit il limite di 4096 bit per le chiavi RSA è assolutamente sufficiente, mentre se si usano algoritmi simmetrici da 256 bit può essere consigliabile utilizzare chiavi RSA di dimensione superiore. La modifica è descritta in questo sito. Praticamente, aprite il file "gpg.c" nella sottocartella "g10", andate alla linea 1996 e cambiate "32768" in "131072". Salvate e chiudete il file. Poi, aprite il file "keygen.c", sempre nella sottocartella "g10", andate alla linea 1575 e cambiate "4096" in "65535". Salvate e chiudete il file. Tenete presente che questa operazione è a vostro rischio e pericolo di incorrere in eventuali problemi e incompatibilità. Tenete anche presente che, anche se ora GnuPG sarà in grado di creare chiavi RSA da 65535 bit, chiavi più lunghe di 16000-20000 bit sono totalmente inutili se usate in combinazione con algoritmi simmetrici da 256 bit (il massimo attualmente supportato in GnuPG).
3.1) Scrivete i seguenti comandi al prompt di MinGW,
appena lo avete avviato:
a) cd gnupg-1.4.13
b) CFLAGS='-O2 -m32 -march=i386
-mfpmath=387 -mno-mmx -mno-sse -mno-3dnow -mno-sse2'
LDFLAGS='-s -static' ./configure --with-included-zlib
Altre opzioni possono essere aggiunte alla fine della riga di comando di "./configure". Ad esempio, si può aggiungere "--enable-camellia" per abilitare il supporto sperimentale all'algoritmo di cifratura "Camellia". Una lista delle possibili opzioni è visualizzabile con il comando "./configure --help". Con questa procedura si otterrà un eseguibile in grado di girare su qualunque macchina i386. Nel caso in cui vogliate invece attivare delle ottimizzazioni particolari per la vostra macchina, potete sostituire i parametri all'interno della variabile CFLAGS con quelli che preferite. Ad esempio, per una macchina Pentium 4 potete specificare:
CFLAGS='-O3 -m32 -march=pentium4 -mfpmath=sse',
oppure, per un Athlon-XP:
CFLAGS='-O3 -m32 -march=athlon-xp -mfpmath=sse'.
Per processori Intel recenti, una buona scelta potrebbe essere una delle seguenti:
CFLAGS='-O3 -m32 -march=pentium-m -mfpmath=sse',
CFLAGS='-O3 -m32 -march=core2 -mfpmath=sse'.
Per processori AMD recenti, una buona scelta potrebbe essere:
CFLAGS='-O3 -m32 -march=amdfam10 -mfpmath=sse'.
Un compromesso tra macchine vecchie e nuove, probabilmente, potrebbe essere uno dei seguenti:
CFLAGS='-O3 -m32 -march=pentium2',
CFLAGS='-O3 -m32 -march=i686 -mmmx'.
Ottimizzazioni più "spinte" si ottengono sostituendo '-O3' con '-Ofast'. Per una lista completa di tutti i parametri che potete passare al
compilatore per attivare particolari ottimizzazioni, vi rimando al manuale di GCC. A questo punto vi
apparirà una lunga serie di messaggi mentre vengono impostati i parametri
della compilazione. Alla fine dovrebbe apparirvi il messaggio riportato
nella figura qui sotto. Se non avviene, vuole dire che c'è stato un errore
di qualche tipo.
c) make
Vi apparirà una lunga serie di messaggi durante la compilazione. Se tutto funziona bene, vi ritroverete nella situazione mostrata nella figura qui sotto. Se no la compilazione si interromperà segnalando un errore.
d) make check
Questo non è un passaggio obbligatorio, ma è utile per controllare che
tutto abbia funzionato bene e la copia di GnuPG appena compilata sia
perfettamente funzionante.
e) iconv -f LATIN1 -t cp850 po/it.po > po/it2.po
&& mv po/it2.po po/it.po && msgfmt -o po/it.gmo po/it.po
ove "it" può essere sostituito con il file di localizzazione che vi
interessa (ad esempio, "fr" per il francese, "es" per lo spagnolo, ecc.) e
"cp850" deve naturalmente essere sostituito con l'effettiva codepage (una
sorta di "tabella dei caratteri") usata dalla vostra versione di Windows
nelle finestre del prompt dei comandi. La codepage 850 è quella, cosiddetta,
dell'Europa occidentale, e viene usata dalle versioni italiane. Per sapere
la codepage usata dalla vostra versione di Windows, aprite una finestra del
prompt dei comandi e usate il comando "chcp". Se siete interessati a più di
una localizzazione di GnuPG, ripetete questo punto "e" per tutti i file di
localizzazione che vi interessano. Se non avete installato libiconv e gettext
al punto 1.6, allora saltate questo punto "e".
3.2) Se tutto è andato bene e non avete avuto errori, allora troverete gpg.exe e gpgv.exe nella sottocartella g10, gpgkeys_hkp.exe, gpgkeys_ldap.exe, gpgkeys_finger.exe e gpgkeys_curl.exe nella cartella keyserver e gpgsplit.exe nella sottocartella tools. A questo punto potete copiarli in una cartella apposita (ad esempio C:\Programmi\GnuPG). Se avete eseguito in punto "3.1e", copiatevi anche il file libiconv-2.dll che troverete in C:\MinGW\bin e cambiategli nome in "iconv.dll". Potete anche copiare il file "it.gmo" (o quello che avete creato al punto 3.1e qui sopra), che troverete nella cartella "po", nella cartella dei file di localizzazione di GnuPG (ad esempio C:\Programmi\GnuPG\gnupg.nls) rinominandolo in "it.mo". Potete a questo punto seguire la normale procedura di installazione di GnuPG per Windows, perfettamente descritta nel sito di Stefano a cui vi rimando e nel file README-W32.txt.