11 months agojs: make method parameters objects
Maximilian Krambach [Wed, 22 Aug 2018 16:37:46 +0000 (18:37 +0200)]
js: make method parameters objects


* As requested by using parties, the options to be passed into the
  methods are now objects, with the objects' properties better
  describing what they do, and to avoid the need to type several nulls
  in a method call if one wants the last parameter.
  - src/Keyring.js, src/gpgme.js: Changed parameters and their
  - BrowserTest/*.js Had to adapt quite some calls to the new format

11 months agojs: improve decryption performance
Maximilian Krambach [Wed, 22 Aug 2018 14:32:31 +0000 (16:32 +0200)]
js: improve decryption performance

* src/Connection.js, src/Helpers.js: performance of decoding incoming
  base64 data was improved to about 4 times the speed by introducing
  two more efficient functions (thanks to for
  finding and testing them)

* src/gpgmejs.js: Decrypted data will now return as Uint8Array, if the
  caller does not wish for a decoding. Decoding binary data will return
  invalid data, and a Uint8Array may be desired. This can be indicated
  by using the (new) 'binary' option in decrypt.

* src/Errors.js A new error in case this decoding fails

* src/Message.js, src/Connection.js: expected is change from base64
  to binary, to avoid confusion later on.

11 months agojs: Return error if signature has no fingerprint
Maximilian Krambach [Wed, 22 Aug 2018 12:49:11 +0000 (14:49 +0200)]
js: Return error if signature has no fingerprint


* src/Signature.js/get fingerprint: A signature with no fingerprint
  should not happen, but if it does, we should throw an error here,
  as the method is a getter.

11 months agoMerge branch 'javascript-binding'
Andre Heinecke [Wed, 22 Aug 2018 11:15:35 +0000 (13:15 +0200)]
Merge branch 'javascript-binding'

This adds a new language binding "gpgme.js" to GPGME. It
serves as a bridge between the native-messaging service "gpgme-json"
and JavaScript Applications.

The first user of this binding will be Mailvelope which will
see GnuPG integration in the near future.

GnuPG-Bug-Id: T4107

11 months agojs: changed verify signature result infos javascript-binding
Maximilian Krambach [Wed, 22 Aug 2018 10:44:05 +0000 (12:44 +0200)]
js: changed verify signature result infos


* the resulting information of verify now are as documented,
  and the same as in a decrypt callback

11 months agojs: throw errors in sync functions
Maximilian Krambach [Wed, 22 Aug 2018 10:18:55 +0000 (12:18 +0200)]
js: throw errors in sync functions


* synchronous functions should throw errors if something goes wrong,
  Promises should reject. This commit changes some error cases that
  returned Error objects instead of throwing them

  - src/Key.js: createKey() and sync Key.get() throw errors
  - src/Error.js: Exporting the list of errors to be able to test and
    compare against these strings
  - src/Keyring.js: Setting a null value in pattern is not useful, and
    now caused an error with the new changes.
  - src/Message.js: createMessage and Message.setParameter now throw

11 months agojs: update decrypt/verify results
Maximilian Krambach [Tue, 21 Aug 2018 13:26:17 +0000 (15:26 +0200)]
js: update decrypt/verify results


* src/gpgmejs.js: Decrypt now parses additional optional dec_info
  information, as well as any verify information, if present

* src/permittedOperations: Now decrypt also expect the new return
  object dec_inf (containing info such as is_mime and file_name)

11 months agojs: remove outdated checklists
Maximilian Krambach [Tue, 21 Aug 2018 12:37:50 +0000 (14:37 +0200)]
js: remove outdated checklists


* They are heavily outdated and offer no more useful information

11 months agojson: Add proper decrypt_result_t handling
Andre Heinecke [Tue, 21 Aug 2018 12:36:42 +0000 (14:36 +0200)]
json: Add proper decrypt_result_t handling

* src/gpgme-json.c (recipient_to_json, decrypt_result_to_json):
(op_decrypt, hlp_decrypt): Update.

The op_decrypt as one of the first operations did not yet
match the current 1 <> 1 mapping of gpgme types to json

info and dec_info are bad names but used for compatibility reasons.

11 months agojs: Fix library name mentioned in js Makefiles
Andre Heinecke [Tue, 21 Aug 2018 11:58:06 +0000 (13:58 +0200)]
js: Fix library name mentioned in js Makefiles


11 months agojs: Update extra_dist files
Andre Heinecke [Tue, 21 Aug 2018 11:56:45 +0000 (13:56 +0200)]
js: Update extra_dist files

* lang/js/BrowserTestExtension/,
lang/js/ (EXTRA_DIST): Update.

11 months agoAdd example manifests for gpgme-json
Andre Heinecke [Tue, 21 Aug 2018 11:24:08 +0000 (13:24 +0200)]
Add example manifests for gpgme-json

* doc/examples/gpgme-chrome.json, doc/examples/gpgme-mozilla.json: New.
* doc/ (EXTRA_DIST): Include them.

The id contained in the examples is the ID of Mailvelope.

11 months agojs: Improve README
Andre Heinecke [Tue, 21 Aug 2018 11:26:01 +0000 (13:26 +0200)]
js: Improve README

* lang/js/README: Clarify structure at the beginning.

11 months agoRemove js as language from
Andre Heinecke [Tue, 21 Aug 2018 10:49:22 +0000 (12:49 +0200)]
Remove js as language from

* Remove js language.

It does not make much sense to integrate gpgme-js into the
GPGME build system. gpgme-js will be distrbuted by it's users
as part of the web extensions / their distribution as that
is the JavaScript way.

So they can use their tools etc. to compile gpgme-js JavaScript
style, which is documented in the lang/js folder.

11 months agojs: set expiry of generatedKey to seconds from now
Maximilian Krambach [Tue, 21 Aug 2018 09:42:11 +0000 (11:42 +0200)]
js: set expiry of generatedKey to seconds from now


* src/Keyring.js: Changed key ecpiration from Date to seconds from
  creation, as in gpgme. The Date parameter used before was due to a
  misunderstanding in documentation and requests from potential users.

11 months agojs: add option "subkey-algo" to generateKey
Maximilian Krambach [Mon, 20 Aug 2018 16:05:34 +0000 (18:05 +0200)]
js: add option "subkey-algo" to generateKey


* The option was recently added to gpgme-json; this reflects this on
  javascript side

11 months agojs: set expiry date on generateKey
Maximilian Krambach [Mon, 20 Aug 2018 15:46:29 +0000 (17:46 +0200)]
js: set expiry date on generateKey


* on the javascript side a Date is expected, gpggme-json expects
  seconds from 'now'

11 months agojson: Add subkey_algo and defaults to createkey
Andre Heinecke [Mon, 20 Aug 2018 14:38:36 +0000 (16:38 +0200)]
json: Add subkey_algo and defaults to createkey

* src/gpgme-json.c (op_createkey, hlp_createkey): Add subkey_algo
(hlp_createkey): Fix documentation of expiry.
Due to the funny quick-gen-key interface generating a key
with an explicit algo would result in bad defaults (only an SC key),
without a subkey.

This adds handling that should probably be in GnuPG proper to fix
the semantics of createkey by adding default subkey_algo handling.

11 months agojs: add and apply eslint rules
Maximilian Krambach [Mon, 20 Aug 2018 13:12:01 +0000 (15:12 +0200)]
js: add and apply eslint rules


* mainly spacing, see .eslintrc.json for details

11 months agojs: revert changes to class read/write restriction
Maximilian Krambach [Mon, 20 Aug 2018 10:12:43 +0000 (12:12 +0200)]
js: revert changes to class read/write restriction


* undoes 94ee0988d4eaac27785de6efb7c19ca9976e1e9c and
  I do not fully understand why my approach was bad, but I am not in
  a position to argue. This revert was requested to me after a review,
  and I'm doing it in the assumption that more experienced people know
  better than me.
* unittests: Also changed some outdated tests that stopped working
  since 754e799d35fd62d7a979452f44342934659908c7 (as GPGME_Key is not
  exported, one cannot check for instanceof in the tests anymore)

11 months agoPython bindings examples
Ben McGinnes [Sun, 19 Aug 2018 04:32:30 +0000 (14:32 +1000)]
Python bindings examples

* fixed a minor typo.
* locates and imports keys from the ProtonMail keyserver.
* the same as the previous except with setting an
  alternative $GNUPGHOME directory.

11 months agoPython bindings setup file
Ben McGinnes [Sat, 18 Aug 2018 14:21:47 +0000 (00:21 +1000)]
Python bindings setup file

* Moved the build import back up where it belongs.
* Included comments indicating how to build and install for multiple
  Python versions beyond the first 2 on the same system.

11 months agoPython bindings tests: Near PEP8 compliance
Ben McGinnes [Sat, 18 Aug 2018 10:29:14 +0000 (20:29 +1000)]
Python bindings tests: Near PEP8 compliance

* PEP8 compliance for the vast majoeity of the tests.

11 months agoPython bindings examples: PEP8 conpliance
Ben McGinnes [Sat, 18 Aug 2018 08:46:47 +0000 (18:46 +1000)]
Python bindings examples: PEP8 conpliance

* Appears to be complete compliance.

11 months agoPython bindings setup: Near PEP8 compliance
Ben McGinnes [Sat, 18 Aug 2018 08:19:16 +0000 (18:19 +1000)]
Python bindings setup: Near PEP8 compliance

* lang/python/ Fixed most things, but there's still an
  issue near the build portion with the existing Python bugs referenced.
* lang/python/ Now PEP8 compliant.

11 months agoPython bindings constants: PEP8 compliance (almost)
Ben McGinnes [Sat, 18 Aug 2018 05:36:23 +0000 (15:36 +1000)]
Python bindings constants: PEP8 compliance (almost)

* PEP8 compliance for all constants except the globals in
  src/constants/ depending on whether the import sequence
  affects the globals themselves.

11 months agoPython bindings src: PEP8 compliance
Ben McGinnes [Sat, 18 Aug 2018 05:05:34 +0000 (15:05 +1000)]
Python bindings src: PEP8 compliance

* import namespace clearance for src/*.py.
* Fixed a handful of is/is not None checks as well.

12 months agojs: decode arriving gpg message strings
Maximilian Krambach [Fri, 17 Aug 2018 17:20:35 +0000 (19:20 +0200)]
js: decode arriving gpg message strings


* Arriving strings (i.e. user id names, error messages) are not
  always in javascript encoding. This is an attempt to go through
  the whole gpgme answer (with the exception of payload data) and
  to fix the encoding of these

12 months agojs: correct decrypt result info (2)
Maximilian Krambach [Fri, 17 Aug 2018 16:25:57 +0000 (18:25 +0200)]
js: correct decrypt result info (2)


* the permittedOperation from last commit ended up in the wrong place.
  sign does not return an additional 'info' object.

12 months agojs: expect additional 'info' to arrive on decrypt, too
Maximilian Krambach [Fri, 17 Aug 2018 15:55:11 +0000 (17:55 +0200)]
js: expect additional 'info' to arrive on decrypt, too


* src/permittedOperations.js: if decrypt includes a verification,
  this info needs to pass, too.

12 months agojs: decrypt callback is_mime fix
Maximilian Krambach [Fri, 17 Aug 2018 15:44:06 +0000 (17:44 +0200)]
js: decrypt callback is_mime fix


* src/gpgmejs: is_mime should report its' counterpart. Also,
  file_name is not optional in specification. We'll send null if
  there is no file_name

12 months agojs: don't expire new keys if no date is set
Maximilian Krambach [Fri, 17 Aug 2018 15:20:35 +0000 (17:20 +0200)]
js: don't expire new keys if no date is set


* src/Keyring.js A new Key without expiration is documented as
  'never expire' here, and should behave accordingly. This requires
  sending '0' here.

12 months agojs: small documentation fix
Maximilian Krambach [Fri, 17 Aug 2018 15:14:51 +0000 (17:14 +0200)]
js: small documentation fix


12 months agojs: removed Key.armor property in synchronous use
Maximilian Krambach [Fri, 17 Aug 2018 14:57:41 +0000 (16:57 +0200)]
js: removed Key.armor property in synchronous use


* src/Key.js The synchronous mode for a Key does not offer an armor/
  armored property anymore. This frees up a lot of performance issues,
  also the armored expoort is expected to change quite often, so a
  cached version is not advisable.

* hasSecret/getHasSecret is now refactored, to reflect their uses.
  With get('hasSecret') there is a method that fetches the result.

* src/Key.js also some refactoring

12 months agojs: disallow bulk set data on key from outside
Maximilian Krambach [Fri, 17 Aug 2018 12:40:27 +0000 (14:40 +0200)]
js: disallow bulk set data on key from outside


* src/Key.js Key class is not exported anymore, as it should not be
  used directly anywhere. setKeyData is no more a method of the Key,
  (optional) data are now validated and set on Key creation and on
  updates, both from within this module, thus no longer exposing
  setKeyData to the outside.
* createKey now gained an optional parameter which allows to set Key
  data at this point.

12 months agojs: importKey feedback refactor
Maximilian Krambach [Thu, 16 Aug 2018 15:58:11 +0000 (17:58 +0200)]
js: importKey feedback refactor

* src/Keyring.js: An empty result should no longer cause an error,
  the import feedback summary has been refactored slightly
* Browsertests to reflect import feedback change

12 months agojs: fix import feedback
Maximilian Krambach [Thu, 16 Aug 2018 15:07:29 +0000 (17:07 +0200)]
js: fix import feedback

* src/Keyring.js For Key imports without prepare_sync the import
  feedback was lacking the summary

12 months agojs: avoid async getters
Maximilian Krambach [Thu, 16 Aug 2018 12:40:53 +0000 (14:40 +0200)]
js: avoid async getters


* src/Key.js get armored was returning a promise on async keys.
  As getters should not do that, it returns an error in this case.

12 months agojs: wrong object assumed in recent commit
Maximilian Krambach [Thu, 16 Aug 2018 10:13:10 +0000 (12:13 +0200)]
js: wrong object assumed in recent commit


* src/Keyring.js I wrongly assumed an object to be a GPGME_Key,
  it was the raw answer from nativeMessaging instead. Now it returns
  a GPGME_Key again.

12 months agojs: get default key fixes
Maximilian Krambach [Thu, 16 Aug 2018 10:03:30 +0000 (12:03 +0200)]
js: get default key fixes


* src/Keyring.js: The answer was not parsed correctly, so a config was
  being ignored.

* If no config is set, we return the first non-invalid key with a
  secret, instead of the first key (which may be e.g. an expired one)

12 months agojs: simplify getDefaultKey
Maximilian Krambach [Thu, 16 Aug 2018 09:29:10 +0000 (11:29 +0200)]
js: simplify getDefaultKey


* src/Keyring.js: In case no default Key is set in configuration,
  only Keys reported as having a secret part should be considered
  for default Keys, avoiding some extra requests.

12 months agojs: consistently return uppercase fingerprint
Maximilian Krambach [Thu, 16 Aug 2018 09:25:50 +0000 (11:25 +0200)]
js: consistently return uppercase fingerprint


* src/Key.js: the fingerprint returned by a Key is now always upper
  case hex, even if the constructor had lower case input. This is to be
  more consistent with gpgme and to be more readable and reliable in

12 months agoSymmetric example
Ben McGinnes [Mon, 13 Aug 2018 16:55:56 +0000 (02:55 +1000)]
Symmetric example

* lang/python/examples/howto/ *sigh*; passphrase was
  right the first time, just the error check that wasn't.
* I really should stop second guessing myself one of these days ...

Signed-off-by: Ben McGinnes <>
12 months agoSymmetric encryption example
Ben McGinnes [Mon, 13 Aug 2018 16:48:38 +0000 (02:48 +1000)]
Symmetric encryption example

* lang/python/examples/howto/ Fixed the error code
  and the passphrase key word arg.

12 months agoSymmetric encryption example.
Ben McGinnes [Mon, 13 Aug 2018 16:22:36 +0000 (02:22 +1000)]
Symmetric encryption example.

* lang/python/examples/howto/ A variation on standard
  key based encryption.

12 months agoPEP8 compliance and other code fixes
Ben McGinnes [Fri, 10 Aug 2018 01:25:01 +0000 (11:25 +1000)]
PEP8 compliance and other code fixes

* Ran all the .py files in src/ and below through Yapf.
* Included some manual edits of, this time successfully making
  two notorious sections a bit more pythonic than scheming.
* Left the module imports as is.
* This will be committed if it passes the most essential test:
  compiling, installing and running it.

Signed-off-by: Ben McGinnes <>
12 months agoLink fixes
Ben McGinnes [Thu, 9 Aug 2018 17:39:46 +0000 (03:39 +1000)]
Link fixes

* lang/python/README: Fixed links in both versions of the README.

12 months agojson: Wipe memory in cJSON_Delete
Andre Heinecke [Wed, 8 Aug 2018 12:27:24 +0000 (14:27 +0200)]
json: Wipe memory in cJSON_Delete

* src/cJSON.c (cJSON_Delete): Wipe memory on deletion.

12 months agojson: Only use calloc instead of malloc
Andre Heinecke [Wed, 8 Aug 2018 12:25:28 +0000 (14:25 +0200)]
json: Only use calloc instead of malloc

* src/cJSON.c, src/gpgme-json.c (CALLOC_ONLY): New define
to change xmalloc / xtrymalloc to use calloc.

Some people consider malloc dangerous as it might allow an
information leak.

12 months agojson: Add checks when skipping byte
Andre Heinecke [Wed, 8 Aug 2018 11:30:01 +0000 (13:30 +0200)]
json: Add checks when skipping byte

* src/cJSON.c (parse_string, cJSON_Minify): Check for
terminating NULL byte when skipping the byte after a an escaped

12 months agojson: Don't error out if chunksize is omitted
Andre Heinecke [Wed, 8 Aug 2018 07:49:51 +0000 (09:49 +0200)]
json: Don't error out if chunksize is omitted

* src/gpgme-json.c (encode_and_chunk): Don't error out
if no chunksize is provided.

This fixes 82e4b900a96c837392259469a9a5821a95e7a707 which
caused every call without chunksize to error out.

12 months agocpp: Fix use after free in gencardkeyinteractor
Andre Heinecke [Wed, 8 Aug 2018 07:22:46 +0000 (09:22 +0200)]
cpp: Fix use after free in gencardkeyinteractor

* lang/cpp/src/gpggencardkeyinteractor.cpp
(GpgGenCardKeyInteractor::Private::keysize): Change to string.

The value is only required as string so we can save it this
way to avoid the need to convert it for the action command.

GnuPG-Bug-Id: T4094

12 months agoMake GNUPGHOME for tests overridable
Andre Heinecke [Mon, 6 Aug 2018 07:30:47 +0000 (09:30 +0200)]
Make GNUPGHOME for tests overridable

* lang/python/tests/,
tests/opassuan/ (GNUPGHOME): Make variable explict.

If the build directory has too long path, gpgme could fail.
This is similar to

In order to fix that, this patch extracts the GNUPGHOME variable
to be presented directly in the Makefile and thus overridable by
command line option.

A build system can then create a symlink to the GNUPGHOME directory
in /tmp and use that symlink as the GNUPGHOME directory
thus making the path very short.

GnuPG-Bug-Id: T4091

Patch provided by vlmarek

12 months agojs: make init export immutable
Maximilian Krambach [Wed, 1 Aug 2018 10:51:12 +0000 (12:51 +0200)]
js: make init export immutable


* src/index.js: The export now uses a freezed Object, which does not
  allow for simply overwriting the init method by e.g. a third-party
* BrowsertestExtension: Added some tests trying if decryption of bad
  data properly fails

12 months agojs: fix confusion about loop in last commit
Maximilian Krambach [Tue, 31 Jul 2018 15:35:52 +0000 (17:35 +0200)]
js: fix confusion about loop in last commit


* The aim is to iterate through the results of the first request
 (all keys), and then add the propert 'hasSecret' to those that
  are in the second request (secret Keysring)  as well. I messed
  this up in a recent change, and it escaped testing.

12 months agojs: Fix Key.hasSecret answer
Maximilian Krambach [Tue, 31 Jul 2018 14:54:43 +0000 (16:54 +0200)]
js: Fix Key.hasSecret answer


* The comparision result between Keyring and Keyring with secrets was
  set to the wrong Object which was not returned at all.

12 months agojs: Making objects inmutable
Maximilian Krambach [Mon, 30 Jul 2018 10:31:27 +0000 (12:31 +0200)]
js: Making objects inmutable


* An Object.freeze should stop any malicious third party from changing
  objects' methods once the objects are instantiated (see unittest for
  an approach that would have worked before)
  - An initialized gpgmejs- object doesn't have a '_Keyring' property
    anymore (it still has its 'Keyring')
  - The internal expect='base64' needed to be turned into a method.

12 months agojs: fix indentaion
Maximilian Krambach [Fri, 27 Jul 2018 18:56:11 +0000 (20:56 +0200)]
js: fix indentaion


* doing the indentation changes that became neccesary in the last

12 months agojs: change the write access for js class methods
Maximilian Krambach [Fri, 27 Jul 2018 18:36:21 +0000 (20:36 +0200)]
js: change the write access for js class methods

* src/ [Connection, Error, Key, Keyring, MEssage, Signature, gpgmejs]:
    Functions and values that are not meant to be overwritten are now
    moved into their constructors, thus eliminating the possibility of
    overwrites after initialization.

* Key: The mode of use (synchronous cached, or async promises) ivs now
  determined at initialization of that Key. The property Key.isAsync
  reflects this state.

* unittests: fixed old Key syntax for testing.

* Message.js isComplete is now a method and not a getter anymore.

* Added some startup tests.

12 months agojs: clean up test extension
Maximilian Krambach [Fri, 27 Jul 2018 09:20:33 +0000 (11:20 +0200)]
js: clean up test extension


Tests will now run with one instance of gpgmejs each block,
which reduces overhead. Readability is (hopefully) improved),
some negative tests are added.

There is still a performance problem in base64 encoding/decoding,
which causes some tests to fail due to time out.

12 months agojs: include armored Key in import callback
Maximilian Krambach [Tue, 24 Jul 2018 12:56:33 +0000 (14:56 +0200)]
js: include armored Key in import callback


* The import answer now also directly contains the armored Key as Key
  property, without need to refresh the Key object created in the
  answer. This allows for direct comparision of input and output.
* BrowserTestExtension: added test for that import callback

12 months agojs: Fix wrong encoding in received error messages
Maximilian Krambach [Tue, 24 Jul 2018 12:50:54 +0000 (14:50 +0200)]
js: Fix wrong encoding in received error messages


* The libgpg error strings arrive in the browser in a different
  encoding than used by browsers. Escaping and then decoding it
  should cover most languages in the supported browsers.

12 months agocpp: Add safety checks for key update
Andre Heinecke [Tue, 24 Jul 2018 06:40:28 +0000 (08:40 +0200)]
cpp: Add safety checks for key update

* lang/cpp/src/key.cpp (Key::update): Check that the key is
not NULL.
* lang/cpp/src/verificationresult.cpp (GpgME::Signature::key):
Check for fingerprint.

12 months agodocs: python bindings howto
Ben McGinnes [Sun, 22 Jul 2018 15:16:31 +0000 (01:16 +1000)]
docs: python bindings howto

* Fixed and tested the changes necessary for org-mode to correctly
  parse pythonic (Python 3) indentation.
* Updated the source blocks to recommended upper case for BEGIN_SRC
  and END_SRC.
* Tested and confirmed XHTML output matches correct examples.
* Tested against pseudo-control output via exporting from org-mode to
  org-mode and then exporting that to XHTML.  Remaining differences
  appear to be discarding the custom tags used to provide X[HT]ML id
  elements to each section which does not appear to offer any benefit.
* Exporting directly to XHTML or other HTML output should no longer
  cause problems, but if there are any then the first step should be
  exporting from org-to-org and then exporting that to XHTML.

Tested-by: Ben McGinnes <>
Signed-off-by: Ben McGinnes <>
12 months agodoc: python bindings howto
Ben McGinnes [Sun, 22 Jul 2018 14:21:05 +0000 (00:21 +1000)]
doc: python bindings howto

* Another retrofitting of the HOWTO Python example code, this time
  following adjustments to python-mode configuration and having
  trawled through the org-mode mailing lists for clues.

12 months agodoc: python bindings howto
Ben McGinnes [Sun, 22 Jul 2018 11:20:41 +0000 (21:20 +1000)]
doc: python bindings howto

* Added org-mode byline.

12 months agojs: repair BrowserTextExtension test
Maximilian Krambach [Fri, 20 Jul 2018 08:59:57 +0000 (10:59 +0200)]
js: repair BrowserTextExtension test


* the signed message to verify was signed by a wrong test key

12 months agocore: Clear all flags for a new data property.
Werner Koch [Thu, 19 Jul 2018 18:38:21 +0000 (20:38 +0200)]
core: Clear all flags for a new data property.

(insert_into_property_table): Use it here.  Clear all flags.

Fixes-commit: 085cdeddef637cc057362fcbde13b0261b8699ec
Signed-off-by: Werner Koch <>
12 months agocore: Blank out the plaintext after decryption failure.
Werner Koch [Thu, 19 Jul 2018 15:38:50 +0000 (17:38 +0200)]
core: Blank out the plaintext after decryption failure.

* src/data.h (data_prop_t): New enum.
(struct gpgme_data): Add field propidx.
* src/data.c (property_t): New.
(property_table, property_table_size, property_table_lock): New.
(insert_into_property_table): New.
(remove_from_property_table): New.
(_gpgme_data_get_dserial): New.
(_gpgme_data_set_prop): New.
(_gpgme_data_get_prop): New.
(_gpgme_data_new): Connect new object to property_table.
(_gpgme_data_release): Remove from property_table.
(gpgme_data_read): With DATA_PROP_BLANKOUT set don't fill the buffer.
* src/data-mem.c (gpgme_data_release_and_get_mem): Likewise.
* src/decrypt.c (struct op_data): Add field plaintext_dserial.
(_gpgme_op_decrypt_init_result): Add arg plaintext and init new field.
(_gpgme_decrypt_status_handler): Set DATA_PROP_BLANKOUT on decryption
(_gpgme_decrypt_start): Pass PLAIN to the init function.
* src/decrypt-verify.c (decrypt_verify_start): Ditto.
* Check for stdint.h and bail out if uint64_t is not

This is a best effort feature to not output plaintext after a
decryption failure (e.g. due to no or broken authenticated
encryption).  It always work when using a memory object and reading it
after the decryption but it can't work reliable when the user is
reading from the data object while the decryption process is still

This is quite a large change because the data objects and the context
objects are allowed to be owned by different threads.  Thus a
synchronization is needed and we do this with a global table of all
data objects to which the context objects can do soft-linking via a
unique data object serial number.

Signed-off-by: Werner Koch <>
12 months agocpp: Print origin and last update for key/uid
Andre Heinecke [Thu, 19 Jul 2018 10:58:49 +0000 (12:58 +0200)]
cpp: Print origin and last update for key/uid

* lang/cpp/src/key.cpp: Print origin and last update in
iostream operators.

12 months agojson: Don't use strdup but the xtrystrdup wrapper.
Werner Koch [Thu, 19 Jul 2018 07:46:57 +0000 (09:46 +0200)]
json: Don't use strdup but the xtrystrdup wrapper.

* src/gpgme-json.c (create_keylist_patterns): Use CNT as first arg for
(process_request): s/strdup/xtrystrdup/.

calloc takes two arguments so to be able to detect integer overflow.
Thus if we switch from malloc to calloc we should utilize that.

Signed-off-by: Werner Koch <>
12 months agocore: New interface gpgme_data_new_from_estream.
Werner Koch [Thu, 19 Jul 2018 07:50:30 +0000 (09:50 +0200)]
core: New interface gpgme_data_new_from_estream.

* src/ (gpgme_data_new_from_estream): New.
* src/data-estream.c: New.
* src/data.h (gpgme_data): New union member e_stream.

The estream functions (gpgrt_fopen et al.) are any waypart of the
required libgpg-error library and thus it makes sense to provide this
convenience interface.

Signed-off-by: Werner Koch <>
13 months agojs: typo in comment
Maximilian Krambach [Wed, 18 Jul 2018 11:43:47 +0000 (13:43 +0200)]
js: typo in comment


* Documentation typo that caused jsdoc to exit with an error

13 months agojson: Fix memleak in native msging repl
Andre Heinecke [Wed, 18 Jul 2018 11:15:02 +0000 (13:15 +0200)]
json: Fix memleak in native msging repl

* src/gpgme-json.c (native_messaging_repl): Free request and
response after each loop.

If we only accept once request we should not loop. If we loop
we should do it properly.

13 months agojson: Ensure that native msging request is string
Andre Heinecke [Wed, 18 Jul 2018 11:06:08 +0000 (13:06 +0200)]
json: Ensure that native msging request is string

* src/gpgme-json.c (native_messaging_repl): Ensure that the
request is NULL terminated.

This avoids potential memory leaks and access to unmapped memory
in case the request was not terminated.
Other request functions use es_read_line which gurantees NULL

13 months agojson: Fix crash by ensuring response is never NULL
Andre Heinecke [Wed, 18 Jul 2018 11:02:32 +0000 (13:02 +0200)]
json: Fix crash by ensuring response is never NULL

* src/gpgme-json.c (encode_and_chunk): Try to always
return at least an error.
(process_request): Double check that it does not return NULL.

If process_request returns NULL the following strlen on it
would crash.

13 months agojson: Fix memory errors in create_keylist_patterns
Andre Heinecke [Wed, 18 Jul 2018 10:57:51 +0000 (12:57 +0200)]
json: Fix memory errors in create_keylist_patterns

* src/gpgme-json.c (create_keylist_patterns): Reserve two
pointers more then linefeeds.
(create_keylist_patterns): Fix loop to count linebreaks.
(create_keylist_patterns): Use calloc for good measure.

This fixes crashes and memory corruption as cnt did not
match i.

13 months agoqt: Handle encoding for diagnostics
Andre Heinecke [Wed, 18 Jul 2018 09:27:46 +0000 (11:27 +0200)]
qt: Handle encoding for diagnostics

* lang/qt/src/threadedjobmixin.cpp (fromEncoding)
(stringFromGpgOutput): New helpers.
(markupDiagnostics): Use it.

The Problem is that on my western windows system GnuPG
gets CP 437 as GetConsoleOutputCP and prints in that codepage.
In a W32 GUI Application we get 0 as GetConsoleOutputCP and 1252
with GetACP.

The only thing that seemed to somehow match was GetOEMCP but
that might just be luck and it might still be broken in
other windows languages.

This code is also used in Kleopatra so it might make sense
to make it public once it is demonstrated that it works on
most systems.

13 months agojs: fix getkeys with locate option
Maximilian Krambach [Tue, 17 Jul 2018 09:07:49 +0000 (11:07 +0200)]
js: fix getkeys with locate option


* src/Keyring.js:
  As locate will not work with the "secret" option, the first message
  cannot be reused, thus a new one must be created here

13 months agojson: Fix crash on invalid json
Andre Heinecke [Mon, 16 Jul 2018 17:47:11 +0000 (19:47 +0200)]
json: Fix crash on invalid json

* src/gpgme-json.c (process_request): Init res. Check for
json object before encode and chunk.

If json is invalid we can't read chunksize and would crash
in encode and chunk.

13 months agojson: Fix uninitialized key unref in op_delete
Andre Heinecke [Mon, 16 Jul 2018 17:46:04 +0000 (19:46 +0200)]
json: Fix uninitialized key unref in op_delete

* src/gpgme-json.c (op_delete): Init key.

13 months agojson: Minor cleanups in cJSON.c
Werner Koch [Mon, 16 Jul 2018 12:42:30 +0000 (14:42 +0200)]
json: Minor cleanups in cJSON.c

* src/cJSON.c: Add comments on the origin of the code.
(parse_string): Allocate an extra byte for safeness.
(cJSON_AddItemToArray): Allo ARRAY to be NULL.

Signed-off-by: Werner Koch <>
13 months agojson: Fix buffer overflow in cJSON.c
Werner Koch [Mon, 16 Jul 2018 10:34:52 +0000 (12:34 +0200)]
json: Fix buffer overflow in cJSON.c

* src/cJSON.c (parse_string): Correctly detect bad hex.

The call to parse_hex4 checks that only hex digits follow and in the
error case returns 0.  However, by the time of the combined check for
an invalid value and the error PTR has already been set to the last
hex character and thus if the end-of-string or a quote character was
one of the bad hex digits the loop will miss the end of the string
which does not match with the simple buffer length allocation test at
the begin of the function.

Signed-off-by: Werner Koch <>
13 months agopython bindings: example scripts
Ben McGinnes [Fri, 13 Jul 2018 10:36:27 +0000 (20:36 +1000)]
python bindings: example scripts

* Fixed incorrect mention of output prompt referencing secret keys
  when the scripts are only for exporting public keys in whole or
  minimised forms.

13 months agojs: allow optional Key retrieve pattern to be null
Maximilian Krambach [Thu, 12 Jul 2018 09:48:17 +0000 (11:48 +0200)]
js: allow optional Key retrieve pattern to be null


* src/Keyring.js: If the optional "pattern" parameter is not to be
  used, but another, following parameter is, null is more of a
  convention in javascript, thus both null and undefined are
  interpreted as "this parameter is not meant to be set".

13 months agojs: add with-sec-fprs to getKeysArmored
Maximilian Krambach [Thu, 12 Jul 2018 09:36:55 +0000 (11:36 +0200)]
js: add with-sec-fprs to getKeysArmored


* Reflects the changes made to gpgme-json in commit

  - getKeysArmored now returns an object with property 'armored' being
    the exported armored block, and an (optional) array of fingerprint
    strings for those keys that can be used in sign/encrypt operations
    as property 'secret_fprs'. With this, extensions such as mailvelope
    will be able to bulk fetch all necessary key information in one

13 months agojson: Add with-sec-fprs param to export
Andre Heinecke [Wed, 11 Jul 2018 14:18:24 +0000 (16:18 +0200)]
json: Add with-sec-fprs param to export

* src/gpgme-json.c (add_secret_fprs): New helper.
(op_export, hlp_export): Extend for with-sec fprs.

This is a request from Mailvelope, to import an export
they need the information for which keys from the export
a secret key is also available. For simplicity it is
much preferred to get this information in a single call
without the need to do and parse a keylisting additionally
in a second native-messaging call.

So we make it optional to include that info in the export.

13 months agojs: documentation
Maximilian Krambach [Tue, 10 Jul 2018 12:32:26 +0000 (14:32 +0200)]
js: documentation


* Fixed errors:
- src/Message.js post(): Set chunksize to defined default value instead
  of hardcoded
- src/Keys.js: added getHasSecret() to refreshKey operation.

* Reviewed and updated the documentation

* non-documentation changes which do not affect functionality:
- src/Errors: disabled a console.warn that is only useful for debugging
- helpers.js: renamed "string" to "value" in isFingerprint and isLongId
  to avoid confusion
- src/Keyring: prepare_sync, search are both explicitly set to false by

13 months agoexample scripts: python work-arounds
Ben McGinnes [Tue, 10 Jul 2018 03:40:18 +0000 (13:40 +1000)]
example scripts: python work-arounds

* fixed three typos which were guaranteed to break said script.

13 months agodocs: python bindings howto
Ben McGinnes [Mon, 9 Jul 2018 11:30:20 +0000 (21:30 +1000)]
docs: python bindings howto

* Complete typographic overhaul.
* Removed all section level indentation since it does not affect
  output formatting, but might affect source code examples.
* In text-mode stripped out all tabs which had crept in and replaced
  them with four spaces.
* Updated all code examples (again) to conform with Python-mode.
* Bumped version number in preparation for next release of GPG 2.2.9
  and corresponding GPGME release.

13 months agojs: fix verify result reporting
Maximilian Krambach [Mon, 9 Jul 2018 09:57:01 +0000 (11:57 +0200)]
js: fix verify result reporting


* src/Signature.js: searching for overall validity in the "summary"
* BrowsertestExtension: Added two verify tests

13 months agojson: Add with-secret without secret only
Andre Heinecke [Mon, 9 Jul 2018 09:36:28 +0000 (11:36 +0200)]
json: Add with-secret without secret only

* src/gpgme-json.c (op_keylist, hlp_keylist): Add "with-secret"
as a flag to do a public keylist with secret information.

13 months agojs: reduce request spam at getKeys()
Maximilian Krambach [Mon, 9 Jul 2018 09:24:46 +0000 (11:24 +0200)]
js: reduce request spam at getKeys()


* Don't make a secret-Key request for each Key retrieved, use one
  request for all of them instead, and assemble the info later. This
  should reduce the traffic with large Keyrings. The bulk retrieval
  for the public armored Keys for each of these Keys is still up to

* unittests: disabled assertion for the armored key (as it currently
  doesn't work)

* encryptTest: clarified the mechanism/reason of rejection for
  Messages >64 MB. This is still a TODO, as this error comes from a
  different place (the browser itself) and behaves different from the
  other errors.

13 months agotests: Add --with-secret to run-keylist.c
Andre Heinecke [Mon, 9 Jul 2018 09:17:27 +0000 (11:17 +0200)]
tests: Add --with-secret to run-keylist.c

* run-keylist.c (show_usage, main): Add --with-secret.

13 months agodoc: More explicit doc for EXTERN and LOCAL modes.
Andre Heinecke [Mon, 9 Jul 2018 09:10:19 +0000 (11:10 +0200)]
doc: More explicit doc for EXTERN and LOCAL modes.

* doc/gpgme.texi (GPGME_KEYLIST_MODE_EXTERN),
command line flags for CMS and OpenPGP Protocol.

This might help new users coming to gnupg to understand what
the flags do.

13 months agoAdd ctx flag for auto-key-locate
Andre Heinecke [Tue, 3 Jul 2018 15:50:23 +0000 (17:50 +0200)]
Add ctx flag for auto-key-locate

* src/context.h (gpgme_context): Add auto_key_locate.
* src/engine-gpg.c (engine_gpg): Add auto_key_locate.
(gpg_set_engine_flags, build_argv): Handle auto_key_locate.
(gpg_release): Free auto_key_locate.
* src/gpgme.c (gpgme_release): Free auto_key_locate.
(gpgme_get_ctx_flag, gpgme_set_ctx_flag): Handle auto-key-locate.
* doc/gpgme.texi: Document auto-key-locate flag.
* tests/run-keylist.c (show_usage, main): Add --from-wkd option.

This enables users of GPGME to control more fine grained what
auto-key-locate does.  Especially for WKD lookups / refreshes
can this be useful.

GnuPG-Bug-Id: T2917
Differential Revision:

13 months agopython bindings: howto examples
Ben McGinnes [Sat, 7 Jul 2018 17:40:35 +0000 (03:40 +1000)]
python bindings: howto examples

* Made sure all example scripts meet PEP8 compliance.
* Required fixing approx. a dozen of them in minor ways.

13 months agoqt: Handle OpenPGP Diagnostic log
Andre Heinecke [Thu, 5 Jul 2018 09:28:08 +0000 (11:28 +0200)]
qt: Handle OpenPGP Diagnostic log

* lang/qt/src/threadedjobmixin.cpp (_detail::audit_log_as_html):
Handle OpenPGP audit log differently.

13 months agocpp: Add enum mapping for GPGME_AUDIT_LOG_DIAG
Andre Heinecke [Thu, 5 Jul 2018 08:22:13 +0000 (10:22 +0200)]
cpp: Add enum mapping for GPGME_AUDIT_LOG_DIAG

* src/context.cpp (to_auditlog_flags): Map DIAG value.
* src/context.h (AuditLogFlags): Add it.

13 months agocore: Add gpg auditlog to get diagnostics
Andre Heinecke [Wed, 4 Jul 2018 13:39:01 +0000 (15:39 +0200)]
core: Add gpg auditlog to get diagnostics

* src/engine-gpg.c (engine_gpg): Add diagnostics member.
(gpg_release): Release diagnostics data.
(gpg_new): Set up logger-fd and diagnostics.
(gpg_getauditlog): New. Copy diagnostics to a user data.
(engine_ops): Add getauditlog.
* src/engine-gpgsm.c (gpgsm_getauditlog): Return not implemented
* src/getauditlog.c (getauditlog_start): Don't reset engine
for diagnostics.
* tests/run-decrypt.c (show_usage, main): Add --diagnostics.
* doc/gpgme.texi(Additional Logs): Document getauditlog.

This enables users of GPGME to get more verbose information
from gpg which can assist users in figuring out a problem
that was before hidden behind a generalized error like
"Decryption Failed".

For GPGSM it is not yet available as it is problematic to
get it properly in server mode and GPGSM already had the
original audit log mechanism in place.

GPGME_AUDITLOG_DEFAULT was added for a more explicit