Compilare GnuPG per Win32 con MinGW

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

Versione 0.9.9g RC14...

... ovvero, a me ha compilato, a voi non so... ;-)

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.12 [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.12 (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.12" 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 2023 e cambiate "32768" in "131072". Salvate e chiudete il file. Poi, aprite il file "keygen.c", sempre nella sottocartella "g10", andate alla linea 1580 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.12
b) CFLAGS='-O2 -m32 -march=i386 -mfpmath=387 -mno-mmx -mno-sse -mno-3dnow -mno-sse2' LDFLAGS='-s' ./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 ---