diff options
Diffstat (limited to '')
| -rw-r--r-- | src/engine-backend.h | 6 | ||||
| -rw-r--r-- | src/engine-gpg.c | 162 | ||||
| -rw-r--r-- | src/engine-gpgsm.c | 50 | ||||
| -rw-r--r-- | src/engine.c | 10 | ||||
| -rw-r--r-- | src/engine.h | 4 | ||||
| -rw-r--r-- | src/export.c | 2 | ||||
| -rw-r--r-- | src/genkey.c | 172 | ||||
| -rw-r--r-- | src/gpgme.def | 3 | ||||
| -rw-r--r-- | src/gpgme.h.in | 56 | ||||
| -rw-r--r-- | src/libgpgme.vers | 6 | 
10 files changed, 413 insertions, 58 deletions
| diff --git a/src/engine-backend.h b/src/engine-backend.h index a15194e6..842292dd 100644 --- a/src/engine-backend.h +++ b/src/engine-backend.h @@ -82,7 +82,11 @@ struct engine_ops    gpgme_error_t (*export_ext) (void *engine, const char *pattern[],  			       gpgme_export_mode_t mode, gpgme_data_t keydata,  			       int use_armor); -  gpgme_error_t (*genkey) (void *engine, gpgme_data_t help_data, int use_armor, +  gpgme_error_t (*genkey) (void *engine, +                           const char *userid, const char *algo, +                           unsigned long reserved, unsigned long expires, +                           gpgme_key_t key, unsigned int flags, +                           gpgme_data_t help_data, int use_armor,  			   gpgme_data_t pubkey, gpgme_data_t seckey);    gpgme_error_t (*import) (void *engine, gpgme_data_t keydata,                             gpgme_key_t *keyarray); diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 3f77ba87..289578b0 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -1964,22 +1964,11 @@ gpg_export_ext (void *engine, const char *pattern[], gpgme_export_mode_t mode,  static gpgme_error_t -gpg_genkey (void *engine, gpgme_data_t help_data, int use_armor, -	    gpgme_data_t pubkey, gpgme_data_t seckey) +gpg_createkey_from_param (engine_gpg_t gpg, +                          gpgme_data_t help_data, int use_armor)  { -  engine_gpg_t gpg = engine;    gpgme_error_t err; -  if (!gpg) -    return gpg_error (GPG_ERR_INV_VALUE); - -  /* We need a special mechanism to get the fd of a pipe here, so that -     we can use this for the %pubring and %secring parameters.  We -     don't have this yet, so we implement only the adding to the -     standard keyrings.  */ -  if (pubkey || seckey) -    return gpg_error (GPG_ERR_NOT_IMPLEMENTED); -    err = add_arg (gpg, "--gen-key");    if (!err && use_armor)      err = add_arg (gpg, "--armor"); @@ -1987,9 +1976,156 @@ gpg_genkey (void *engine, gpgme_data_t help_data, int use_armor,      err = add_arg (gpg, "--");    if (!err)      err = add_data (gpg, help_data, -1, 0); +  if (!err) +    err = start (gpg); +  return err; +} + + +/* This is used for gpg versions which do not support the quick-genkey + * command to emulate the gpgme_op_createkey API.  */ +static gpgme_error_t +gpg_createkey_legacy (engine_gpg_t gpg, +               const char *userid, const char *algo, +               unsigned long expires, +               unsigned int flags, +               int use_armor) +{ +  return gpg_error (GPG_ERR_NOT_IMPLEMENTED); +} + + +static gpgme_error_t +gpg_createkey (engine_gpg_t gpg, +               const char *userid, const char *algo, +               unsigned long expires, +               unsigned int flags, +               int use_armor) +{ +  gpgme_error_t err; + +  err = add_arg (gpg, "--quick-gen-key"); +  if (!err && use_armor) +    err = add_arg (gpg, "--armor"); +  if (!err && (flags & GPGME_CREATE_NOPASSWD)) +    { +      err = add_arg (gpg, "--passphrase"); +      if (!err) +        err = add_arg (gpg, ""); +    } +  if (!err && (flags & GPGME_CREATE_FORCE)) +    err = add_arg (gpg, "--yes"); +  if (!err) +    err = add_arg (gpg, "--"); +  if (!err) +    err = add_arg (gpg, userid); + +  /* This condition is only required to allow the use of gpg < 2.1.16 */ +  if (algo +      || (flags & (GPGME_CREATE_SIGN | GPGME_CREATE_ENCR +                   | GPGME_CREATE_CERT | GPGME_CREATE_AUTH)) +      || expires) +    { + +      if (!err) +        err = add_arg (gpg, algo? algo : "default"); +      if (!err) +        { +          char tmpbuf[5*4+1]; +          snprintf (tmpbuf, sizeof tmpbuf, "%s%s%s%s", +                    (flags & GPGME_CREATE_SIGN)? " sign":"", +                    (flags & GPGME_CREATE_ENCR)? " encr":"", +                    (flags & GPGME_CREATE_CERT)? " cert":"", +                    (flags & GPGME_CREATE_AUTH)? " auth":""); +          err = add_arg (gpg, *tmpbuf? tmpbuf : "default"); +        } +      if (!err && expires) +        { +          char tmpbuf[8+20]; +          snprintf (tmpbuf, sizeof tmpbuf, "seconds=%lu", expires); +          err = add_arg (gpg, tmpbuf); +        } +    }    if (!err)      err = start (gpg); +  return err; +} + + +static gpgme_error_t +gpg_addkey (engine_gpg_t gpg, +            const char *algo, +            unsigned long expires, +            gpgme_key_t key, +            unsigned int flags, +            int use_armor) +{ +  return gpg_error (GPG_ERR_NOT_IMPLEMENTED); +} + + +static gpgme_error_t +gpg_adduid (engine_gpg_t gpg, +            const char *userid, +            unsigned int flags, +            int use_armor) +{ +  return gpg_error (GPG_ERR_NOT_IMPLEMENTED); +} + + +static gpgme_error_t +gpg_genkey (void *engine, +            const char *userid, const char *algo, +            unsigned long reserved, unsigned long expires, +            gpgme_key_t key, unsigned int flags, +            gpgme_data_t help_data, int use_armor, +	    gpgme_data_t pubkey, gpgme_data_t seckey) +{ +  engine_gpg_t gpg = engine; +  gpgme_error_t err; + +  (void)reserved; + +  if (!gpg) +    return gpg_error (GPG_ERR_INV_VALUE); + +  /* If HELP_DATA is given the use of the old interface +   * (gpgme_op_genkey) has been requested.  The other modes are: +   * +   *  USERID && !KEY          - Create a new keyblock. +   * !USERID &&  KEY          - Add a new subkey to KEY (gpg >= 2.1.14) +   *  USERID &&  KEY && !ALGO - Add a new user id to KEY (gpg >= 2.1.14). +   * +   */ +  if (help_data) +    { +      /* We need a special mechanism to get the fd of a pipe here, so +         that we can use this for the %pubring and %secring +         parameters.  We don't have this yet, so we implement only the +         adding to the standard keyrings.  */ +      if (pubkey || seckey) +        err = gpg_error (GPG_ERR_NOT_IMPLEMENTED); +      else +        err = gpg_createkey_from_param (gpg, help_data, use_armor); +    } +  else if (userid && !key) +    { +      if (!have_gpg_version (gpg, "2.1.13")) +        err = gpg_createkey_legacy (gpg, userid, algo, expires, flags, +                                    use_armor); +      else +        err = gpg_createkey (gpg, userid, algo, expires, flags, use_armor); +    } +  else if (!have_gpg_version (gpg, "2.1.13")) +    err = gpg_error (GPG_ERR_NOT_SUPPORTED); +  else if (!userid && key) +    err = gpg_addkey (gpg, algo, expires, key, flags, use_armor); +  else if (userid && key && !algo) +    err = gpg_adduid (gpg, userid, flags, use_armor); +  else +    err = gpg_error (GPG_ERR_INV_VALUE);    return err;  } diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index d4a1cf77..3f3230bb 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -1433,29 +1433,49 @@ gpgsm_export_ext (void *engine, const char *pattern[], gpgme_export_mode_t mode,  static gpgme_error_t -gpgsm_genkey (void *engine, gpgme_data_t help_data, int use_armor, +gpgsm_genkey (void *engine, +              const char *userid, const char *algo, +              unsigned long reserved, unsigned long expires, +              gpgme_key_t key, unsigned int flags, +              gpgme_data_t help_data, int use_armor,  	      gpgme_data_t pubkey, gpgme_data_t seckey)  {    engine_gpgsm_t gpgsm = engine;    gpgme_error_t err; -  if (!gpgsm || !pubkey || seckey) +  (void)reserved; + +  if (!gpgsm)      return gpg_error (GPG_ERR_INV_VALUE); -  gpgsm->input_cb.data = help_data; -  err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data)); -  if (err) -    return err; -  gpgsm->output_cb.data = pubkey; -  err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor" -		      : map_data_enc (gpgsm->output_cb.data)); -  if (err) -    return err; -  gpgsm_clear_fd (gpgsm, MESSAGE_FD); -  gpgsm->inline_data = NULL; +  if (help_data) +    { +      if (!pubkey || seckey) +        return gpg_error (GPG_ERR_INV_VALUE); -  err = start (gpgsm, "GENKEY"); -  return err; +      gpgsm->input_cb.data = help_data; +      err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data)); +      if (err) +        return err; +      gpgsm->output_cb.data = pubkey; +      err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor" +                          : map_data_enc (gpgsm->output_cb.data)); +      if (err) +        return err; +      gpgsm_clear_fd (gpgsm, MESSAGE_FD); +      gpgsm->inline_data = NULL; + +      err = start (gpgsm, "GENKEY"); +      return err; +    } + +  (void)userid; +  (void)expires; +  (void)key; +  (void)flags; + +  /* The new interface has not yet been implemented,  */ +  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);  } diff --git a/src/engine.c b/src/engine.c index f428034d..1ff86981 100644 --- a/src/engine.c +++ b/src/engine.c @@ -773,7 +773,11 @@ _gpgme_engine_op_export_ext (engine_t engine, const char *pattern[],  gpgme_error_t -_gpgme_engine_op_genkey (engine_t engine, gpgme_data_t help_data, +_gpgme_engine_op_genkey (engine_t engine, +                         const char *userid, const char *algo, +                         unsigned long reserved, unsigned long expires, +                         gpgme_key_t key, unsigned int flags, +                         gpgme_data_t help_data,  			 int use_armor, gpgme_data_t pubkey,  			 gpgme_data_t seckey)  { @@ -783,7 +787,9 @@ _gpgme_engine_op_genkey (engine_t engine, gpgme_data_t help_data,    if (!engine->ops->genkey)      return gpg_error (GPG_ERR_NOT_IMPLEMENTED); -  return (*engine->ops->genkey) (engine->engine, help_data, use_armor, +  return (*engine->ops->genkey) (engine->engine, +                                 userid, algo, reserved, expires, key, flags, +                                 help_data, use_armor,  				 pubkey, seckey);  } diff --git a/src/engine.h b/src/engine.h index b713d961..857dff42 100644 --- a/src/engine.h +++ b/src/engine.h @@ -108,6 +108,10 @@ gpgme_error_t _gpgme_engine_op_export_ext (engine_t engine,  					   gpgme_data_t keydata,  					   int use_armor);  gpgme_error_t _gpgme_engine_op_genkey (engine_t engine, +                                       const char *userid, const char *algo, +                                       unsigned long reserved, +                                       unsigned long expires, +                                       gpgme_key_t key, unsigned int flags,  				       gpgme_data_t help_data,  				       int use_armor, gpgme_data_t pubkey,  				       gpgme_data_t seckey); diff --git a/src/export.c b/src/export.c index a29fbde8..41a9ebaf 100644 --- a/src/export.c +++ b/src/export.c @@ -34,7 +34,7 @@  /* Local operation data.  */  typedef struct  { -  gpg_error_t err;  /* Error encountred during the export.  */ +  gpg_error_t err;  /* Error encountered during the export.  */  } *op_data_t; diff --git a/src/genkey.c b/src/genkey.c index 34cc5af4..0b795f43 100644 --- a/src/genkey.c +++ b/src/genkey.c @@ -1,23 +1,22 @@  /* genkey.c - Key generation. -   Copyright (C) 2000 Werner Koch (dd9jn) -   Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH - -   This file is part of GPGME. - -   GPGME is free software; you can redistribute it and/or modify it -   under the terms of the GNU Lesser General Public License as -   published by the Free Software Foundation; either version 2.1 of -   the License, or (at your option) any later version. - -   GPGME is distributed in the hope that it will be useful, but -   WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with this program; if not, write to the Free Software -   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -   02111-1307, USA.  */ + * Copyright (C) 2000 Werner Koch (dd9jn) + * Copyright (C) 2001, 2002, 2003, 2004, 2016 g10 Code GmbH + * + * This file is part of GPGME. + * + * GPGME is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * GPGME is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see <http://www.gnu.org/licenses/>. + */  #if HAVE_CONFIG_H  #include <config.h> @@ -40,6 +39,9 @@ typedef struct    /* The error code from a FAILURE status line or 0.  */    gpg_error_t failure_code; +  /* The error code from certain ERROR status lines or 0.  */ +  gpg_error_t error_code; +    /* The key parameters passed to the crypto engine.  */    gpgme_data_t key_parameter;  } *op_data_t; @@ -82,7 +84,39 @@ gpgme_op_genkey_result (gpgme_ctx_t ctx)    return &opd->result;  } + +/* Parse an error status line.  Return the error location and the +   error code.  The function may modify ARGS. */ +static char * +parse_error (char *args, gpg_error_t *r_err) +{ +  char *where = strchr (args, ' '); +  char *which; + +  if (where) +    { +      *where = '\0'; +      which = where + 1; + +      where = strchr (which, ' '); +      if (where) +	*where = '\0'; + +      where = args; +    } +  else +    { +      *r_err = trace_gpg_error (GPG_ERR_INV_ENGINE); +      return NULL; +    } + +  *r_err = atoi (which); + +  return where; +} + +  static gpgme_error_t  genkey_status_handler (void *priv, gpgme_status_code_t code, char *args)  { @@ -90,6 +124,7 @@ genkey_status_handler (void *priv, gpgme_status_code_t code, char *args)    gpgme_error_t err;    void *hook;    op_data_t opd; +  char *loc;    /* Pipe the status code through the progress status handler.  */    err = _gpgme_progress_status_handler (ctx, code, args); @@ -121,13 +156,22 @@ genkey_status_handler (void *priv, gpgme_status_code_t code, char *args)  	}        break; +    case GPGME_STATUS_ERROR: +      loc = parse_error (args, &err); +      if (!loc) +        return err; +      if (!opd->error_code) +        opd->error_code = err; +      break; +      case GPGME_STATUS_FAILURE:        opd->failure_code = _gpgme_parse_failure (args);        break;      case GPGME_STATUS_EOF: -      /* FIXME: Should return some more useful error value.  */ -      if (!opd->result.primary && !opd->result.sub) +      if (opd->error_code) +        return opd->error_code; +      else if (!opd->result.primary && !opd->result.sub)  	return gpg_error (GPG_ERR_GENERAL);        else if (opd->failure_code)          return opd->failure_code; @@ -212,7 +256,9 @@ genkey_start (gpgme_ctx_t ctx, int synchronous, const char *parms,          return err;      } -  return _gpgme_engine_op_genkey (ctx->engine, opd->key_parameter, +  return _gpgme_engine_op_genkey (ctx->engine, +                                  NULL, NULL, 0, 0, NULL, 0, +                                  opd->key_parameter,  				  ctx->use_armor, pubkey, seckey);  } @@ -259,3 +305,85 @@ gpgme_op_genkey (gpgme_ctx_t ctx, const char *parms, gpgme_data_t pubkey,      err = _gpgme_wait_one (ctx);    return TRACE_ERR (err);  } + + + +static gpgme_error_t +createkey_start (gpgme_ctx_t ctx, int synchronous, +                 const char *userid, const char *algo, +                 unsigned long reserved, unsigned long expires, +                 gpgme_key_t anchorkey, unsigned int flags) +{ +  gpgme_error_t err; +  void *hook; +  op_data_t opd; + +  err = _gpgme_op_reset (ctx, synchronous); +  if (err) +    return err; + +  if (reserved || anchorkey || !userid) +    return gpg_error (GPG_ERR_INV_VALUE); + +  err = _gpgme_op_data_lookup (ctx, OPDATA_GENKEY, &hook, +			       sizeof (*opd), release_op_data); +  opd = hook; +  if (err) +    return err; + +  _gpgme_engine_set_status_handler (ctx->engine, genkey_status_handler, ctx); + +  if (ctx->passphrase_cb) +    { +      err = _gpgme_engine_set_command_handler +        (ctx->engine, _gpgme_passphrase_command_handler, ctx, NULL); +      if (err) +        return err; +    } + +  return _gpgme_engine_op_genkey (ctx->engine, +                                  userid, algo, reserved, expires, +                                  anchorkey, flags, +                                  NULL, ctx->use_armor, NULL, NULL); + +} + + +gpgme_error_t +gpgme_op_createkey_start (gpgme_ctx_t ctx, const char *userid, const char *algo, +                          unsigned long reserved, unsigned long expires, +                          gpgme_key_t anchorkey, unsigned int flags) +{ +  gpgme_error_t err; + +  TRACE_BEG3 (DEBUG_CTX, "gpgme_op_createkey_start", ctx, +	      "userid='%s', algo='%s' flags=0x%x", userid, algo, flags); + +  if (!ctx) +    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE)); + +  err = createkey_start (ctx, 0, +                         userid, algo, reserved, expires, anchorkey, flags); +  return TRACE_ERR (err); +} + + +gpgme_error_t +gpgme_op_createkey (gpgme_ctx_t ctx, const char *userid, const char *algo, +                    unsigned long reserved, unsigned long expires, +                    gpgme_key_t anchorkey, unsigned int flags) +{ +  gpgme_error_t err; + +  TRACE_BEG3 (DEBUG_CTX, "gpgme_op_createkey", ctx, +	      "userid='%s', algo='%s' flags=0x%x", userid, algo, flags); + +  if (!ctx) +    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE)); + +  err = createkey_start (ctx, 1, +                         userid, algo, reserved, expires, anchorkey, flags); +  if (!err) +    err = _gpgme_wait_one (ctx); +  return TRACE_ERR (err); +} diff --git a/src/gpgme.def b/src/gpgme.def index a15c35b5..a56b9efa 100644 --- a/src/gpgme.def +++ b/src/gpgme.def @@ -229,5 +229,8 @@ EXPORTS      gpgme_data_set_flag                   @171 +    gpgme_op_createkey_start              @172 +    gpgme_op_createkey                    @173 +  ; END diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 00a4bed3..0fdc9276 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1815,6 +1815,18 @@ gpgme_error_t gpgme_op_export_keys (gpgme_ctx_t ctx,   * Key generation.   */ +/* Flags for the key creation functions.  */ +#define GPGME_CREATE_SIGN       (1 << 0)  /* Allow usage: signing.     */ +#define GPGME_CREATE_ENCR       (1 << 1)  /* Allow usage: encryption.  */ +#define GPGME_CREATE_CERT       (1 << 2)  /* Allow usage: certification.  */ +#define GPGME_CREATE_AUTH       (1 << 3)  /* Allow usage: authentication.  */ +#define GPGME_CREATE_NOPASSWD   (1 << 7)  /* Create w/o passphrase.    */ +#define GPGME_CREATE_SELFSIGNED (1 << 8)  /* Create self-signed cert.  */ +#define GPGME_CREATE_NOSTORE    (1 << 9)  /* Do not store the key.     */ +#define GPGME_CREATE_WANTPUB    (1 << 10) /* Return the public key.    */ +#define GPGME_CREATE_WANTSEC    (1 << 11) /* Return the secret key.    */ +#define GPGME_CREATE_FORCE      (1 << 12) /* Force creation.           */ +  struct _gpgme_op_genkey_result  {    /* A primary key was generated.  */ @@ -1828,6 +1840,14 @@ struct _gpgme_op_genkey_result    /* The fingerprint of the generated key.  */    char *fpr; + +  /* A memory data object with the created public key.  Only set when +   * GPGME_CREATE_WANTPUB has been used. */ +  gpgme_data_t pubkey; + +  /* A memory data object with the created secret key.  Only set when +   * GPGME_CREATE_WANTSEC has been used. */ +  gpgme_data_t seckey;  };  typedef struct _gpgme_op_genkey_result *gpgme_genkey_result_t; @@ -1839,7 +1859,39 @@ gpgme_error_t gpgme_op_genkey_start (gpgme_ctx_t ctx, const char *parms,  gpgme_error_t gpgme_op_genkey (gpgme_ctx_t ctx, const char *parms,  			       gpgme_data_t pubkey, gpgme_data_t seckey); -/* Retrieve a pointer to the result of the genkey operation.  */ +/* Generate a key pair using the modern interface.  */ +gpgme_error_t gpgme_op_createkey_start (gpgme_ctx_t ctx, +                                        const char *userid, +                                        const char *algo, +                                        unsigned long reserved, +                                        unsigned long expires, +                                        gpgme_key_t certkey, +                                        unsigned int flags); +gpgme_error_t gpgme_op_createkey       (gpgme_ctx_t ctx, +                                        const char *userid, +                                        const char *algo, +                                        unsigned long reserved, +                                        unsigned long expires, +                                        gpgme_key_t certkey, +                                        unsigned int flags); +/* Add a new subkey to KEY.  */ +gpgme_error_t gpgme_op_createsubkey_start (gpgme_ctx_t ctx, +                                           gpgme_key_t key, +                                           const char *algo, +                                           unsigned long reserved, +                                           unsigned long expires, +                                           unsigned int flags); +gpgme_error_t gpgme_op_createsubkey       (gpgme_ctx_t ctx, +                                           gpgme_key_t key, +                                           const char *algo, +                                           unsigned long reserved, +                                           unsigned long expires, +                                           unsigned int flags); + + + +/* Retrieve a pointer to the result of a genkey, createkey, or + * createsubkey operation.  */  gpgme_genkey_result_t gpgme_op_genkey_result (gpgme_ctx_t ctx); @@ -2177,7 +2229,7 @@ typedef struct gpgme_conf_arg  } *gpgme_conf_arg_t; -/* The flags of a configuration option.  See the gpg-conf +/* The flags of a configuration option.  See the gpgconf     documentation for details.  */  #define GPGME_CONF_GROUP	(1 << 0)  #define GPGME_CONF_OPTIONAL	(1 << 1) diff --git a/src/libgpgme.vers b/src/libgpgme.vers index d29bc147..b06c9c65 100644 --- a/src/libgpgme.vers +++ b/src/libgpgme.vers @@ -101,6 +101,10 @@ GPGME_1.1 {      gpgme_pubkey_algo_string;      gpgme_set_ctx_flag; +    gpgme_data_set_flag; + +    gpgme_op_createkey_start; +    gpgme_op_createkey;  }; @@ -230,8 +234,6 @@ GPGME_1.0 {      gpgme_err_code_from_syserror;      gpgme_err_set_errno; -    gpgme_data_set_flag; -    local:      *; | 
