From vollkorn at cryptobitch.de Fri Oct 20 22:23:21 2017 From: vollkorn at cryptobitch.de (Jan Girlich) Date: Fri, 20 Oct 2017 22:23:21 +0200 Subject: gpgme Python-Bindings und set_passphrase_cb Message-ID: <977a8876-4f7e-e371-304f-8aad4979f2b3@cryptobitch.de> Moin, ich versuche gerade mit den gpgme Python-Bindings einen Text mit einem privaten, passwortgeschützten Key zu signieren. Das bekomme ich aber nicht ans Laufen. So sieht mein Code aus: import gpg def passphrase(hint, desc, prev_bad): return 'test_passwort' with gpg.Context(armor=True, pinentry_mode=gpg.constants.PINENTRY_MODE_LOOPBACK, home_dir='ROOT/gpg_home_folder') as c: c.set_passphrase_cb(passphrase) sender_key = c.get_key('0xDBBA0A4D') recipient_key = c.get_key('0x0B04220B') c.signers = [sender_key] encrypted_body, _1, _2 = c.encrypt('T?est'.encode(), recipients= [sender_key, recipient_key], sign=True, always_trust=True) Ich erhalte folgende Fehlermeldung: Traceback (most recent call last): File "gpg_test.py", line 18, in encrypted_body, _1, _2 = c.encrypt('T?est'.encode(), recipients=[sender_key, recipient_key], sign=True, always_trust=True) File "/home/jan/Projekte/AA/env/lib/python3.5/site-packages/gpg/core.py", line 269, in encrypt self.op_encrypt_sign(recipients, flags, plaintext, ciphertext) File "/home/jan/Projekte/AA/env/lib/python3.5/site-packages/gpg/core.py", line 151, in wrapper return _funcwrap(self, *args) File "/home/jan/Projekte/AA/env/lib/python3.5/site-packages/gpg/core.py", line 135, in _funcwrap return errorcheck(result, "Invocation of " + name) File "/home/jan/Projekte/AA/env/lib/python3.5/site-packages/gpg/errors.py", line 62, in errorcheck raise GPGMEError(retval, extradata) gpg.errors.GPGMEError: Invocation of gpgme_op_encrypt_sign: Unspecified source: No secret key gpg.errors.GPGMEError: Invocation of gpgme_op_sign: GPGME: Unusable secret key In meiner gpg-agent.conf steht nur "allow-loopback-pinentry" und in meiner gpg.conf "keyserver hkp://keys.gnupg.net". Mit gpg habe ich sichergestellt, dass der Key im Keyring ist und das Passwort für den sender_key habe ich direkt vor dem Test gesetzt. Mit dem Debugger habe ich festgestellt, dass meine passphrase() nie aufgerufen wird. Warum wird die nicht aufgerufen? Besten Gruß Jan Girlich From wk at gnupg.org Sun Oct 22 19:25:31 2017 From: wk at gnupg.org (Werner Koch) Date: Sun, 22 Oct 2017 19:25:31 +0200 Subject: gpgme Python-Bindings und set_passphrase_cb In-Reply-To: <977a8876-4f7e-e371-304f-8aad4979f2b3@cryptobitch.de> (Jan Girlich's message of "Fri, 20 Oct 2017 22:23:21 +0200") References: <977a8876-4f7e-e371-304f-8aad4979f2b3@cryptobitch.de> Message-ID: <87bmkzf62c.fsf@wheatstone.g10code.de> 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? Salam-Shalom, Werner -- Die Gedanken sind frei. Ausnahmen regelt ein Bundesgesetz. -------------- nächster Teil -------------- Ein Dateianhang mit Binärdaten wurde abgetrennt... Dateiname : nicht verfügbar Dateityp : application/pgp-signature Dateigröße : 227 bytes Beschreibung: nicht verfügbar URL : From vollkorn at cryptobitch.de Mon Oct 23 09:47:48 2017 From: vollkorn at cryptobitch.de (Jan Girlich) Date: Mon, 23 Oct 2017 09:47:48 +0200 Subject: gpgme Python-Bindings und set_passphrase_cb In-Reply-To: <87bmkzf62c.fsf@wheatstone.g10code.de> References: <977a8876-4f7e-e371-304f-8aad4979f2b3@cryptobitch.de> <87bmkzf62c.fsf@wheatstone.g10code.de> Message-ID: <3e8df06c-cdfe-8956-2f1d-d178817b356f@cryptobitch.de> 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