Evolution, GPG e gli errori con gli hash SHA256


by pandafunk

Non riuscite a spiegarvi perché Sylpheed o Thunderbird riescono tranquillamente a firmare e cifrare email con la vostra chiave DSA 2048 ed Evolution non ne vuole sapere nemmeno a pagarlo mostrandovi sempre l’errore riportato di seguito?

Impossibile creare il messaggio.

Because "gpg: scrittura in `-'
gpg: la chiave DSA AB2CB45C richiede un hash di 256 bit
o più grande
gpg: signing failed: errore generale
", you may need to select different mail options.

Sappiate che stavolta non è colpa nostra, è un bug di qualche anno fa! Sembrerebbe che ci sia anche una patch pronta ma bloccata da altre questioni di compatibilità che, a quanto si legge nelle mailing list, dovrebbero essere risolte nella versione 2.32… ad oggi Ubuntu 10.10 maverick offre ancora Evolution 2.30.3.

Sostanzialmente il problema è che Evolution forza GPG ad usare l’algoritmo di hashing SHA1 anche se la chiave utilizzata ne richiede un altro, tra l’altro il parametro che viene passato a GPG (--digest-algo=SHA1) è hard coded: praticamente l’unica soluzione in attesa della di quella ufficiale è utilizzare un piccolo wrapper a gpg che strippi quel parametro all’ignaro -e permettetemi non così evoluto- Evolution.

Il wrapper indicato nel bug report che ho appena linkato funziona… ma è un tantino invasivo perché bisogna rinominare /usr/bin/gpg in /usr/bin/gpg.real e salvare il wrapper come /bin/gpg. Non che sia nulla di tremendamente pericoloso, nel peggiore dei casi un aggiornamento di GPG lo sovrascriverebbe lasciando un gpg.real orfano e riportando l’errore in Evolution.

Io ne propongo una versione leggermente modificata e meno invasiva che va messa in /usr/local/bin, perché nella maggiorparte degli ambienti i percorsi di ricerca ($PATH) /local/ hanno la precedenza, quindi se salviamo il nostro wrapper in /usr/local/bin/gpg verrà trovato ed usato prima di /usr/bin/gpg.

Il codice è questo:

#!/bin/bash

if ls -l /proc/$PPID/exe | fgrep -e /usr/bin/evolution >/dev/null; then
declare -a newopt
for opt in "$@"; do
if [ "$opt" != "--digest-algo=SHA1" ]; then
newopt[${#newopt[@]}]="$opt"
fi
done
exec /usr/bin/gpg "${newopt[@]}"
else
exec /usr/bin/gpg "$@"
fi

Copiamolo,

sudo gedit /usr/local/bin/gpg

incolliamolo, salviamo e chiudiamo gedit e diamo un

sudo chmod +x /usr/local/bin/gpg.

Quando il bug sarà risolto (speriamo presto) potremo tranquillamente cancellare /usr/local/bin/gpg.


Leave a Reply

You must be logged in to post a comment.