Compilare GnuPG per Win32 con MinGW

(a cura di Carlo Luciano Bianco <clbianco@tiscalinet.it>)

Versione 1.0.0 FINAL...

... ovvero, ogni cosa ha una fine. ;-)

Preambolo alla versione FINAL

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.

0) Preambolo originale del tutorial

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) Installazione di MinGW:

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:

--Immagine: Test dell'installazione. Finestra di MinGW con la versione
di GCC in risposta a un gcc -v. Fine immagine.--

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.

2) Scaricamento e adattamento dei sorgenti di GnuPG:

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.

--Immagine: File SEAT.TEST prima della modifica. Fine immagine.--

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.

--Immagine: File SEAT.TEST dopo la modifica. Fine immagine.--

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) Compilazione di 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

--Immagine: Inizio della compilazione. Finestra di MSYS con la riga di
comando che avvia lo script di configurazione. Fine immagine.--

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

--Immagine: Compilazione vera e propria. Fine dell'esecuzione dello
script di configurazione con il messaggio che avverte che GnuPG è stato
correttamente configurato per essere compilato sotto MinGW32, subito prima
di avviare make. Fine immagine.--

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.

--Immagine: Fine della compilazione. Ultima parte dell'output di make.
Fine immagine.--

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.

--Immagine: Check dopo la compilazione. Output di make check. 
Ultime fasi dell'operazione. Fine immagine.--

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.


--- Valid HTML 4.01! --- Valid CSS! --- Level Triple-A conformance icon, W3C-WAI Web Content Accessibility Guidelines 1.0 ---

--- Bobby WorldWide Approved AAA --- Cynthia Tested! --- Bobby WorldWide Approved 508 ---

--- Backward Compatible --- See your web site through colorblind eyes with the colorblind web page filter. --- Lynx Inspected ---

--- Created with VIM! --- Viewable With Any Browser --- Graphics by GIMP ---

--- Creative Commons License ---

--- OpenPGP Digitally Signed HTML ---