gpgme Python-Bindings und set_passphrase_cb

Jan Girlich vollkorn at cryptobitch.de
Mo Okt 23 09:47:48 CEST 2017


Moin Werner,

Am 22.10.2017 um 19:25 schrieb Werner Koch:
> On Fri, 20 Oct 2017 22:23, vollkorn at cryptobitch.de said:
> 
>> Mit dem Debugger habe ich festgestellt, dass meine passphrase() nie
>> aufgerufen wird.
> 
> Ruf Dein Testprogramm bitte mal so auf:
> 
>   GPGME_DEBUG=9:mylog: ./mytest
> 
> in mylog kannst Du dann den Aufruf von gpg finden.  Wird dort
> --pinentry-mode übergeben?

danke für den Hinweis zum Debugging. Das hat mich auf dich richtige
Fährte gebracht.

1.) --pinentry-mode wird korrekt übergeben.

2.) Ich habe vergessen in get_key() den Parameter secret=True anzugeben.
Das hat komischerweise vorher in anderen Programmen bereits ohne
funktioniert.

3.) Habe ich gelernt wie gpg und gpg2 die privaten Schlüssel verschieden
ablegen und ich meinen privaten Schlüssel nochmal explizit mit gpg2
importieren muss.

Jetzt funktioniert alles. Mein Callback wird aufgerufen und mein Key
entschlüsselt. Hier nochmal für Archivierungszwecke mein
funktionierender Code:

WICHTIG: Alle benutzten privaten Schlüssel müssen mit gpg2 importiert
werden!

import gpg


def passphrase(hint, desc, prev_bad):
    return 'test_passwort'


with gpg.Context(armor=True,
         pinentry_mode=gpg.constants.PINENTRY_MODE_LOOPBACK) as c:
    c.set_passphrase_cb(passphrase)
    recipient_key = c.get_key('0x37B1245E')
    sender_key = c.get_key('0xED797BA5', secret=True)
    c.signers = [sender_key]
    encrypted_body, _1, _2 = c.encrypt('T€est'.encode(),
        recipients=[sender_key, recipient_key], sign=True,
        always_trust=True)

Gruß
Jan




Mehr Informationen über die Mailingliste Gnupg-de