diff options
| author | Marcus Brinkmann <[email protected]> | 2001-11-22 20:48:37 +0000 | 
|---|---|---|
| committer | Marcus Brinkmann <[email protected]> | 2001-11-22 20:48:37 +0000 | 
| commit | 884de0606b851c25190fc7e27ee8de1defcf6a16 (patch) | |
| tree | 0a247529e5eb2f2a42fbbfc6424af80af6aaccf7 | |
| parent | 2001-11-22 Marcus Brinkmann <[email protected]> (diff) | |
| download | gpgme-884de0606b851c25190fc7e27ee8de1defcf6a16.tar.gz gpgme-884de0606b851c25190fc7e27ee8de1defcf6a16.zip | |
2001-11-22  Marcus Brinkmann  <[email protected]>
	* engine.c (_gpgme_engine_op_decrypt): Implement CMS case.
	(_gpgme_engine_op_delete): Likewise.
	(_gpgme_engine_op_encrypt): Likewise.
	(_gpgme_engine_op_export): Likewise.
	(_gpgme_engine_op_genkey): Likewise.
	(_gpgme_engine_op_keylist): Likewise.
	(_gpgme_engine_op_sign): Likewise.
	(_gpgme_engine_op_trustlist): Likewise.
	* engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): New function.
	(gpgsm_assuan_simple_command): Likewise.
	(gpgsm_set_recipients): Likewise.
	(gpgsm_set_fd): Reimplement using gpgsm_assuan_simple_command.
	(_gpgme_gpgsm_op_delete): New function.
	(_gpgme_gpgsm_op_export): Likewise.
	(_gpgme_gpgsm_op_genkey): Likewise.
	(_gpgme_gpgsm_op_sign): Likewise.
	(_gpgme_gpgsm_op_keylist): Likewise.
	(_gpgme_gpgsm_op_trustlist): Likewise.
	(_gpgme_gpgsm_release): Release command.
	(_gpgme_gpgsm_op_decrypt): Allocate command.
	(_gpgme_gpgsm_op_import): Likewise.
	(gpgsm_status_handler): Also treat `ERR' strings as EOF.
Diffstat (limited to '')
| -rw-r--r-- | gpgme/ChangeLog | 26 | ||||
| -rw-r--r-- | gpgme/engine-gpgsm.c | 222 | ||||
| -rw-r--r-- | gpgme/engine-gpgsm.h | 25 | ||||
| -rw-r--r-- | gpgme/engine.c | 30 | 
4 files changed, 265 insertions, 38 deletions
| diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index ed126a84..9ce48eeb 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,5 +1,31 @@  2001-11-22  Marcus Brinkmann  <[email protected]> +	* engine.c (_gpgme_engine_op_decrypt): Implement CMS case. +	(_gpgme_engine_op_delete): Likewise. +	(_gpgme_engine_op_encrypt): Likewise. +	(_gpgme_engine_op_export): Likewise. +	(_gpgme_engine_op_genkey): Likewise. +	(_gpgme_engine_op_keylist): Likewise. +	(_gpgme_engine_op_sign): Likewise. +	(_gpgme_engine_op_trustlist): Likewise. + +	* engine-gpgsm.c (_gpgme_gpgsm_op_encrypt): New function. +	(gpgsm_assuan_simple_command): Likewise. +	(gpgsm_set_recipients): Likewise. +	(gpgsm_set_fd): Reimplement using gpgsm_assuan_simple_command. +	(_gpgme_gpgsm_op_delete): New function. +	(_gpgme_gpgsm_op_export): Likewise. +	(_gpgme_gpgsm_op_genkey): Likewise. +	(_gpgme_gpgsm_op_sign): Likewise. +	(_gpgme_gpgsm_op_keylist): Likewise. +	(_gpgme_gpgsm_op_trustlist): Likewise. +	(_gpgme_gpgsm_release): Release command. +	(_gpgme_gpgsm_op_decrypt): Allocate command. +	(_gpgme_gpgsm_op_import): Likewise. +	(gpgsm_status_handler): Also treat `ERR' strings as EOF. + +2001-11-22  Marcus Brinkmann  <[email protected]> +  	* gpgme.h (gpgme_set_protocol): New prototype.  2001-11-22  Marcus Brinkmann  <[email protected]> diff --git a/gpgme/engine-gpgsm.c b/gpgme/engine-gpgsm.c index fcdb667c..7390f36f 100644 --- a/gpgme/engine-gpgsm.c +++ b/gpgme/engine-gpgsm.c @@ -46,6 +46,7 @@  #include "ops.h"  #include "wait.h"  #include "io.h" +#include "key.h"  #include "engine-gpgsm.h" @@ -175,17 +176,16 @@ _gpgme_gpgsm_release (GpgsmObject gpgsm)      _gpgme_io_close (gpgsm->message_fd);    assuan_pipe_disconnect (gpgsm->assuan_ctx); + +  xfree (gpgsm->command);    xfree (gpgsm);  } -#define COMMANDLINELEN 40  static AssuanError -gpgsm_set_fd (ASSUAN_CONTEXT ctx, const char *which, int fd) +gpgsm_assuan_simple_command (ASSUAN_CONTEXT ctx, char *line)  {    AssuanError err; -  char line[COMMANDLINELEN]; -  snprintf (line, COMMANDLINELEN, "%s FD=%i", which, fd);    err = _assuan_write_line (ctx, line);    if (err)      return err; @@ -206,6 +206,16 @@ gpgsm_set_fd (ASSUAN_CONTEXT ctx, const char *which, int fd)      return ASSUAN_General_Error;  } +#define COMMANDLINELEN 40 +static AssuanError +gpgsm_set_fd (ASSUAN_CONTEXT ctx, const char *which, int fd) +{ +  char line[COMMANDLINELEN]; + +  snprintf (line, COMMANDLINELEN, "%s FD=%i", which, fd); +  return gpgsm_assuan_simple_command (ctx, line); +} +  GpgmeError  _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, GpgmeData plain)  { @@ -214,6 +224,10 @@ _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, GpgmeData plain)    if (!gpgsm)      return mk_error (Invalid_Value); +  gpgsm->command = xtrystrdup ("DECRYPT"); +  if (!gpgsm->command) +    return mk_error (Out_Of_Core); +    gpgsm->input_data = ciph;    err = gpgsm_set_fd (gpgsm->assuan_ctx, "INPUT", gpgsm->input_fd_server);    if (err) @@ -225,11 +239,102 @@ _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, GpgmeData plain)    _gpgme_io_close (gpgsm->message_fd);    gpgsm->message_fd = -1; -  gpgsm->command = "DECRYPT";    return 0;  }  GpgmeError +_gpgme_gpgsm_op_delete (GpgsmObject gpgsm, GpgmeKey key, int allow_secret) +{ +  /* FIXME */ +  return mk_error (Not_Implemented); +} + +static AssuanError +gpgsm_set_recipients (ASSUAN_CONTEXT ctx, GpgmeRecipients recp) +{ +  AssuanError err; +  char *line; +  int linelen; +  struct user_id_s *r; + +  linelen = 10 + 40 + 1;	/* "RECIPIENT " + guess + '\0'.  */ +  line = xtrymalloc (10 + 40 + 1); +  if (!line) +    return ASSUAN_Out_Of_Core; +  strcpy (line, "RECIPIENT "); +  for (r = recp->list; r; r = r->next) +    { +      int newlen = 11 + strlen (r->name); +      if (linelen < newlen) +	{ +	  char *newline = xtryrealloc (line, newlen); +	  if (! newline) +	    { +	      xfree (line); +	      return ASSUAN_Out_Of_Core; +	    } +	  line = newline; +	  linelen = newlen; +	} +      strcpy (&line[10], r->name); +       +      err = gpgsm_assuan_simple_command (ctx, line); +      if (err) +	{ +	  xfree (line); +	  return err; +	} +    } +  return 0; +} + +GpgmeError +_gpgme_gpgsm_op_encrypt (GpgsmObject gpgsm, GpgmeRecipients recp, +			 GpgmeData plain, GpgmeData ciph, int use_armor) +{ +  AssuanError err; + +  if (!gpgsm) +    return mk_error (Invalid_Value); + +  gpgsm->command = xtrystrdup (use_armor ? "ENCRYPT armor" : "ENCRYPT"); +  if (!gpgsm->command) +    return mk_error (Out_Of_Core); + +  gpgsm->input_data = plain; +  err = gpgsm_set_fd (gpgsm->assuan_ctx, "INPUT", gpgsm->input_fd_server); +  if (err) +    return mk_error (General_Error);	/* FIXME */ +  gpgsm->output_data = ciph; +  err = gpgsm_set_fd (gpgsm->assuan_ctx, "OUTPUT", gpgsm->output_fd_server); +  if (err) +    return mk_error (General_Error);	/* FIXME */ +  _gpgme_io_close (gpgsm->message_fd); +  gpgsm->message_fd = -1; + +  err = gpgsm_set_recipients (gpgsm->assuan_ctx, recp); +  if (err) +    return mk_error (General_Error); + +  return 0; +} + +GpgmeError +_gpgme_gpgsm_op_export (GpgsmObject gpgsm, GpgmeRecipients recp, +			GpgmeData keydata, int use_armor) +{ +  /* FIXME */ +  return mk_error (Not_Implemented); +} + +GpgmeError +_gpgme_gpgsm_op_genkey (GpgsmObject gpgsm, GpgmeData help_data, int use_armor) +{ +  /* FIXME */ +  return mk_error (Not_Implemented); +} + +GpgmeError  _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata)  {    AssuanError err; @@ -237,6 +342,10 @@ _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata)    if (!gpgsm)      return mk_error (Invalid_Value); +  gpgsm->command = xtrystrdup ("IMPORT"); +  if (!gpgsm->command) +    return mk_error (Out_Of_Core); +    gpgsm->input_data = keydata;    err = gpgsm_set_fd (gpgsm->assuan_ctx, "INPUT", gpgsm->input_fd_server);    if (err) @@ -246,11 +355,49 @@ _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata)    _gpgme_io_close (gpgsm->message_fd);    gpgsm->message_fd = -1; -  gpgsm->command = "DECRYPT";    return 0;  }  GpgmeError +_gpgme_gpgsm_op_keylist (GpgsmObject gpgsm, const char *pattern, +			 int secret_only, int keylist_mode) +{ +  char *line; + +  line = xtrymalloc (9 + strlen (pattern) + 1);	/* "LISTKEYS " + p + '\0'.  */ +  if (!line) +    return mk_error (Out_Of_Core); +  strcpy (line, "LISTKEYS "); +  strcpy (&line[9], pattern); + +  _gpgme_io_close (gpgsm->input_fd); +  gpgsm->input_fd = -1; +  _gpgme_io_close (gpgsm->output_fd); +  gpgsm->output_fd = -1; +  _gpgme_io_close (gpgsm->message_fd); +  gpgsm->message_fd = -1; + +  gpgsm->command = line; +  return 0; +} + +GpgmeError +_gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out, +		      GpgmeSigMode mode, int use_armor, +		      int use_textmode, GpgmeCtx ctx /* FIXME */) +{ +  /* FIXME */ +  return mk_error (Not_Implemented); +} + +GpgmeError +_gpgme_gpgsm_op_trustlist (GpgsmObject gpgsm, const char *pattern) +{ +  /* FIXME */ +  return mk_error (Not_Implemented); +} + +GpgmeError  _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)  {    AssuanError err; @@ -258,6 +405,10 @@ _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)    if (!gpgsm)      return mk_error (Invalid_Value); +  gpgsm->command = xtrystrdup ("VERIFY"); +  if (!gpgsm->command) +    return mk_error (Out_Of_Core); +    gpgsm->input_data = sig;    err = gpgsm_set_fd (gpgsm->assuan_ctx, "INPUT", gpgsm->input_fd_server);    if (err) @@ -269,7 +420,6 @@ _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)    _gpgme_io_close (gpgsm->output_fd);    gpgsm->output_fd = -1; -  gpgsm->command = "VERIFY";    return 0;  } @@ -287,10 +437,15 @@ gpgsm_status_handler (void *opaque, int pid, int fd)    if (actx->inbound.line[0] == '#' || !actx->inbound.linelen)      return 0;  /* FIXME */ -  if (actx->inbound.linelen >= 2 -      && actx->inbound.line[0] == 'O' && actx->inbound.line[1] == 'K' -      && (actx->inbound.line[2] == '\0' || actx->inbound.line[2] == ' ')) +  if ((actx->inbound.linelen >= 2 +       && actx->inbound.line[0] == 'O' && actx->inbound.line[1] == 'K' +       && (actx->inbound.line[2] == '\0' || actx->inbound.line[2] == ' ')) +      || (actx->inbound.linelen >= 3 +	  && actx->inbound.line[0] == 'E' && actx->inbound.line[1] == 'R' +	  && actx->inbound.line[2] == 'R' +	  && (actx->inbound.line[3] == '\0' || actx->inbound.line[3] == ' ')))      { +      /* FIXME Save error somewhere.  */        if (gpgsm->status.fnc)  	gpgsm->status.fnc (gpgsm->status.fnc_value, STATUS_EOF, "");        return 1; @@ -397,12 +552,59 @@ _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, GpgmeData plain)  }  GpgmeError +_gpgme_gpgsm_op_delete (GpgsmObject gpgsm, GpgmeKey key, int allow_secret) +{ +  return mk_error (Invalid_Engine); +} + +GpgmeError +_gpgme_gpgsm_op_encrypt (GpgsmObject gpgsm, GpgmeRecipients recp, +			 GpgmeData plain, GpgmeData ciph, int use_armor) +{ +  return mk_error (Invalid_Engine); +} + +GpgmeError +_gpgme_gpgsm_op_export (GpgsmObject gpgsm, GpgmeRecipients recp, +			GpgmeData keydata, int use_armor) +{ +  return mk_error (Invalid_Engine); +} + +GpgmeError +_gpgme_gpgsm_op_genkey (GpgsmObject gpgsm, GpgmeData help_data, int use_armor) +{ +  return mk_error (Invalid_Engine); +} +   +GpgmeError  _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata)  {    return mk_error (Invalid_Engine);  }  GpgmeError +_gpgme_gpgsm_op_keylist (GpgsmObject gpgsm, const char *pattern, +			 int secret_only, int keylist_mode) +{ +  return mk_error (Invalid_Engine); +} + +GpgmeError +_gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out, +		      GpgmeSigMode mode, int use_armor, +		      int use_textmode, GpgmeCtx ctx /* FIXME */) +{ +  return mk_error (Invalid_Engine); +} + +GpgmeError +_gpgme_gpgsm_op_trustlist (GpgsmObject gpgsm, const char *pattern) +{ +  return mk_error (Invalid_Engine); +} + +GpgmeError  _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text)  {    return mk_error (Invalid_Engine); diff --git a/gpgme/engine-gpgsm.h b/gpgme/engine-gpgsm.h index 5feada86..bd6dd1e7 100644 --- a/gpgme/engine-gpgsm.h +++ b/gpgme/engine-gpgsm.h @@ -34,23 +34,26 @@ void _gpgme_gpgsm_release (GpgsmObject gpg);  void _gpgme_gpgsm_set_status_handler (GpgsmObject gpgsm,  				      GpgStatusHandler fnc, void *fnc_value);  GpgmeError _gpgme_gpgsm_op_decrypt (GpgsmObject gpgsm, GpgmeData ciph, -				  GpgmeData plain); -GpgmeError _gpgme_gpgsm_op_delete (GpgsmObject gpgsm, GpgmeKey key, int allow_secret); +				    GpgmeData plain); +GpgmeError _gpgme_gpgsm_op_delete (GpgsmObject gpgsm, GpgmeKey key, +				   int allow_secret);  GpgmeError _gpgme_gpgsm_op_encrypt (GpgsmObject gpgsm, GpgmeRecipients recp, -				  GpgmeData plain, GpgmeData ciph, -				  int use_armor); +				    GpgmeData plain, GpgmeData ciph, +				    int use_armor);  GpgmeError _gpgme_gpgsm_op_export (GpgsmObject gpgsm, GpgmeRecipients recp, -				 GpgmeData keydata, int use_armor); +				   GpgmeData keydata, int use_armor);  GpgmeError _gpgme_gpgsm_op_genkey (GpgsmObject gpgsm, GpgmeData help_data, -				 int use_armor); +				   int use_armor);  GpgmeError _gpgme_gpgsm_op_import (GpgsmObject gpgsm, GpgmeData keydata);  GpgmeError _gpgme_gpgsm_op_keylist (GpgsmObject gpgsm, const char *pattern, -				  int secret_only, int keylist_mode); -GpgmeError _gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out, -			       GpgmeSigMode mode, int use_armor, -			       int use_textmode, GpgmeCtx ctx /* FIXME */); +				    int secret_only, int keylist_mode); +GpgmeError _gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, +				 GpgmeData out, +				 GpgmeSigMode mode, int use_armor, +				 int use_textmode, GpgmeCtx ctx /* FIXME */);  GpgmeError _gpgme_gpgsm_op_trustlist (GpgsmObject gpgsm, const char *pattern); -GpgmeError _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, GpgmeData text); +GpgmeError _gpgme_gpgsm_op_verify (GpgsmObject gpgsm, GpgmeData sig, +				   GpgmeData text);  GpgmeError _gpgme_gpgsm_start (GpgsmObject gpgsm, void *opaque);  #endif /* ENGINE_GPGSM_H */ diff --git a/gpgme/engine.c b/gpgme/engine.c index 74951058..08fb9515 100644 --- a/gpgme/engine.c +++ b/gpgme/engine.c @@ -248,8 +248,7 @@ _gpgme_engine_op_decrypt (EngineObject engine, GpgmeData ciph, GpgmeData plain)      case GPGME_PROTOCOL_OpenPGP:        return _gpgme_gpg_op_decrypt (engine->engine.gpg, ciph, plain);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_decrypt (engine->engine.gpgsm, ciph, plain);      default:        break;      } @@ -267,8 +266,7 @@ _gpgme_engine_op_delete (EngineObject engine, GpgmeKey key, int allow_secret)      case GPGME_PROTOCOL_OpenPGP:        return _gpgme_gpg_op_delete (engine->engine.gpg, key, allow_secret);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_delete (engine->engine.gpgsm, key, allow_secret);      default:        break;      } @@ -288,8 +286,8 @@ _gpgme_engine_op_encrypt (EngineObject engine, GpgmeRecipients recp,        return _gpgme_gpg_op_encrypt (engine->engine.gpg, recp, plain, ciph,  				    use_armor);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_encrypt (engine->engine.gpgsm, recp, plain, ciph, +				      use_armor);      default:        break;      } @@ -309,8 +307,8 @@ _gpgme_engine_op_export (EngineObject engine, GpgmeRecipients recp,        return _gpgme_gpg_op_export (engine->engine.gpg, recp, keydata,  				   use_armor);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_export (engine->engine.gpgsm, recp, keydata, +				     use_armor);      default:        break;      } @@ -328,8 +326,7 @@ _gpgme_engine_op_genkey (EngineObject engine, GpgmeData help_data, int use_armor      case GPGME_PROTOCOL_OpenPGP:        return _gpgme_gpg_op_genkey (engine->engine.gpg, help_data, use_armor);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_genkey (engine->engine.gpgsm, help_data, use_armor);      default:        break;      } @@ -347,8 +344,7 @@ _gpgme_engine_op_import (EngineObject engine, GpgmeData keydata)      case GPGME_PROTOCOL_OpenPGP:        return _gpgme_gpg_op_import (engine->engine.gpg, keydata);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_import (engine->engine.gpgsm, keydata);      default:        break;      } @@ -368,8 +364,8 @@ _gpgme_engine_op_keylist (EngineObject engine, const char *pattern, int secret_o        return _gpgme_gpg_op_keylist (engine->engine.gpg, pattern, secret_only,  				    keylist_mode);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_keylist (engine->engine.gpgsm, pattern, secret_only, +				      keylist_mode);      default:        break;      } @@ -390,7 +386,8 @@ _gpgme_engine_op_sign (EngineObject engine, GpgmeData in, GpgmeData out,        return _gpgme_gpg_op_sign (engine->engine.gpg, in, out, mode, use_armor,  				 use_textmode, ctx);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ +      return _gpgme_gpgsm_op_sign (engine->engine.gpgsm, in, out, mode, +				   use_armor, use_textmode, ctx);        break;      default:        break; @@ -409,8 +406,7 @@ _gpgme_engine_op_trustlist (EngineObject engine, const char *pattern)      case GPGME_PROTOCOL_OpenPGP:        return _gpgme_gpg_op_trustlist (engine->engine.gpg, pattern);      case GPGME_PROTOCOL_CMS: -      /* FIXME */ -      break; +      return _gpgme_gpgsm_op_trustlist (engine->engine.gpgsm, pattern);      default:        break;      } | 
