2000-12-18 20:54:43 +00:00
|
|
|
/* genkey.c - key generation
|
|
|
|
* Copyright (C) 2000 Werner Koch (dd9jn)
|
2002-01-31 00:31:44 +00:00
|
|
|
* Copyright (C) 2001, 2002 g10 Code GmbH
|
2000-12-18 20:54:43 +00:00
|
|
|
*
|
|
|
|
* This file is part of GPGME.
|
|
|
|
*
|
|
|
|
* GPGME is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 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 General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
#include "util.h"
|
|
|
|
#include "context.h"
|
|
|
|
#include "ops.h"
|
|
|
|
|
2002-01-31 00:31:44 +00:00
|
|
|
|
|
|
|
struct genkey_result_s
|
|
|
|
{
|
|
|
|
int created_primary : 1;
|
|
|
|
int created_sub : 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
_gpgme_release_genkey_result (GenKeyResult result)
|
|
|
|
{
|
|
|
|
if (!result)
|
|
|
|
return;
|
|
|
|
xfree (result);
|
|
|
|
}
|
|
|
|
|
2000-12-18 20:54:43 +00:00
|
|
|
static void
|
2002-01-31 00:31:44 +00:00
|
|
|
genkey_status_handler (GpgmeCtx ctx, GpgStatusCode code, char *args)
|
2000-12-18 20:54:43 +00:00
|
|
|
{
|
2002-01-31 00:31:44 +00:00
|
|
|
_gpgme_progress_status_handler (ctx, code, args);
|
|
|
|
|
2002-02-02 Marcus Brinkmann <marcus@g10code.de>
This patch has gotten a bit large... mmh. The main thing that
happens here is that error values are now not determined in the
operation function after gpgme_wait completed, but in the status
handler when EOF is received. It should always be the case that
either an error is flagged or EOF is received, so that after a
gpgme_wait you should never have the situation that no error is
flagged and EOF is not received. One problem is that the engine
status handlers don't have access to the context, a horrible
kludge works around this for now. All errors that happen during a
pending operation should be catched and reported in ctx->error,
including out-of-core and cancellation. This rounds up neatly a
couple of loose ends, and makes it possible to pass up any errors
in the communication with the backend as well. As a bonus, there
will be a function to access gpgme->wait, so that the operations
can truly be implemented with their _start function.
* engine-gpgsm.c (gpgsm_status_handler): Horrible kludge to report
error back to the context.
* rungpg.c (gpg_status_handler): Same horrible kludge applied here.
* engine-gpgsm.c (gpgsm_assuan_simple_command): Add error checking.
* wait.c (_gpgme_wait_on_condition): If canceled, set CTX->error
to a value indication that.
* verify.c (add_notation): Set error, not out_of_core.
(finish_sig): Likewise.
(gpgme_op_verify_start): Don't clear out_of_core.
(_gpgme_verify_status_handler): At EOF, clean up the notation data.
(gpgme_op_verify): And don't do it here.
* trustlist.c (trustlist_status_handler): Check error, not out_of_core.
(gpgme_op_trustlist_start): Don't clear out_of_core.
(gpgme_op_trustlist_next): Check error, not out_of_core.
(gpgme_op_trustlist_end): Likewise.
* ops.h (test_and_allocate_result): New macro.
(_gpgme_passphrase_result): Remove prototype.
* delete.c (gpgme_op_delete): Return error from context.
(delete_status_handler): Use macro test_and_allocate_result.
Perform error checking at EOF.
(gpgme_op_delete_start): Release result.
* passphrase.c (_gpgme_passphrase_status_handler): Use macro
test_and_allocate_result, and perform error checking here.
(_gpgme_passphrase_result): Function removed.
* sign.c (gpgme_op_sign_start): Do not set out_of_core to zero.
(gpgme_op_sign): Just return the error value from the context.
(sign_status_handler): Only progress if no error is set yet. If
we process an EOF, set the resulting error value (if any).
* decrypt.c (_gpgme_decrypt_result): Function removed.
(create_result_struct): Function removed.
(_gpgme_decrypt_status_handler): Use macro test_and_allocate_result,
caclulate error on EOF, do not progress with errors.
(_gpgme_decrypt_start): Do not set out_of_core to zero.
(gpgme_op_decrypt): Just return the error value from the context.
* encrypt.c (encrypt_status_handler): Perform the error checking
here.
(gpgme_op_encrypt_start): Do not clear out_of_core.
* export.c (export_status_handler): Return if error is set in context.
(gpgme_op_export_start): Release result.
(gpgme_op_export): Return error from context.
* decrypt-verify.c (gpgme_op_decrypt_verify): Return the error in
the context.
* genkey.c (genkey_status_handler): Use macro
test_and_allocate_result. Perform error checking at EOF.
(gpgme_op_genkey): Just return the error from context.
* import.c (gpgme_op_import): Return the error from context.
(import_status_handler): Use macro test_and_allocate_result.
* keylist.c (gpgme_op_keylist_start): Do not clear out_of_core.
(gpgme_op_keylist_next): Return error of context.
(keylist_colon_handler): Set error instead out_of_code.
(finish_key): Likewise.
* context.h: Remove member out_of_core, add member error.
* gpgme.c (_gpgme_release_result): Clear error flag.
* engine.h (_gpgme_engine_get_error): New prototype.
* engine.c (_gpgme_engine_get_error): New function.
* engine-gpgsm.c (_gpgme_gpgsm_get_error): New function.
* engine-gpgsm.c (map_assuan_error): New function.
(gpgsm_assuan_simple_command): Change return type to GpgmeError,
use the new function to map error values.
(gpgsm_set_fd): Change return type tp GpgmeError.
(_gpgme_gpgsm_op_decrypt): Change type of ERR to GpgmeError.
(gpgsm_set_recipients): Likewise. Change type of return value
equivalently. Adjust error values.
(_gpgme_gpgsm_op_import): Likewise.
(_gpgme_gpgsm_op_sign): Likewise.
(struct gpgsm_object_s): New member error.
(gpgsm_status_handler): Set error if error occurs. Determine
error number from ERR line received. If assuan_read_line fails,
terminate the connection.
2002-02-02 03:52:59 +00:00
|
|
|
if (ctx->error)
|
2002-01-31 00:31:44 +00:00
|
|
|
return;
|
2002-02-02 Marcus Brinkmann <marcus@g10code.de>
This patch has gotten a bit large... mmh. The main thing that
happens here is that error values are now not determined in the
operation function after gpgme_wait completed, but in the status
handler when EOF is received. It should always be the case that
either an error is flagged or EOF is received, so that after a
gpgme_wait you should never have the situation that no error is
flagged and EOF is not received. One problem is that the engine
status handlers don't have access to the context, a horrible
kludge works around this for now. All errors that happen during a
pending operation should be catched and reported in ctx->error,
including out-of-core and cancellation. This rounds up neatly a
couple of loose ends, and makes it possible to pass up any errors
in the communication with the backend as well. As a bonus, there
will be a function to access gpgme->wait, so that the operations
can truly be implemented with their _start function.
* engine-gpgsm.c (gpgsm_status_handler): Horrible kludge to report
error back to the context.
* rungpg.c (gpg_status_handler): Same horrible kludge applied here.
* engine-gpgsm.c (gpgsm_assuan_simple_command): Add error checking.
* wait.c (_gpgme_wait_on_condition): If canceled, set CTX->error
to a value indication that.
* verify.c (add_notation): Set error, not out_of_core.
(finish_sig): Likewise.
(gpgme_op_verify_start): Don't clear out_of_core.
(_gpgme_verify_status_handler): At EOF, clean up the notation data.
(gpgme_op_verify): And don't do it here.
* trustlist.c (trustlist_status_handler): Check error, not out_of_core.
(gpgme_op_trustlist_start): Don't clear out_of_core.
(gpgme_op_trustlist_next): Check error, not out_of_core.
(gpgme_op_trustlist_end): Likewise.
* ops.h (test_and_allocate_result): New macro.
(_gpgme_passphrase_result): Remove prototype.
* delete.c (gpgme_op_delete): Return error from context.
(delete_status_handler): Use macro test_and_allocate_result.
Perform error checking at EOF.
(gpgme_op_delete_start): Release result.
* passphrase.c (_gpgme_passphrase_status_handler): Use macro
test_and_allocate_result, and perform error checking here.
(_gpgme_passphrase_result): Function removed.
* sign.c (gpgme_op_sign_start): Do not set out_of_core to zero.
(gpgme_op_sign): Just return the error value from the context.
(sign_status_handler): Only progress if no error is set yet. If
we process an EOF, set the resulting error value (if any).
* decrypt.c (_gpgme_decrypt_result): Function removed.
(create_result_struct): Function removed.
(_gpgme_decrypt_status_handler): Use macro test_and_allocate_result,
caclulate error on EOF, do not progress with errors.
(_gpgme_decrypt_start): Do not set out_of_core to zero.
(gpgme_op_decrypt): Just return the error value from the context.
* encrypt.c (encrypt_status_handler): Perform the error checking
here.
(gpgme_op_encrypt_start): Do not clear out_of_core.
* export.c (export_status_handler): Return if error is set in context.
(gpgme_op_export_start): Release result.
(gpgme_op_export): Return error from context.
* decrypt-verify.c (gpgme_op_decrypt_verify): Return the error in
the context.
* genkey.c (genkey_status_handler): Use macro
test_and_allocate_result. Perform error checking at EOF.
(gpgme_op_genkey): Just return the error from context.
* import.c (gpgme_op_import): Return the error from context.
(import_status_handler): Use macro test_and_allocate_result.
* keylist.c (gpgme_op_keylist_start): Do not clear out_of_core.
(gpgme_op_keylist_next): Return error of context.
(keylist_colon_handler): Set error instead out_of_code.
(finish_key): Likewise.
* context.h: Remove member out_of_core, add member error.
* gpgme.c (_gpgme_release_result): Clear error flag.
* engine.h (_gpgme_engine_get_error): New prototype.
* engine.c (_gpgme_engine_get_error): New function.
* engine-gpgsm.c (_gpgme_gpgsm_get_error): New function.
* engine-gpgsm.c (map_assuan_error): New function.
(gpgsm_assuan_simple_command): Change return type to GpgmeError,
use the new function to map error values.
(gpgsm_set_fd): Change return type tp GpgmeError.
(_gpgme_gpgsm_op_decrypt): Change type of ERR to GpgmeError.
(gpgsm_set_recipients): Likewise. Change type of return value
equivalently. Adjust error values.
(_gpgme_gpgsm_op_import): Likewise.
(_gpgme_gpgsm_op_sign): Likewise.
(struct gpgsm_object_s): New member error.
(gpgsm_status_handler): Set error if error occurs. Determine
error number from ERR line received. If assuan_read_line fails,
terminate the connection.
2002-02-02 03:52:59 +00:00
|
|
|
test_and_allocate_result (ctx, genkey);
|
2000-12-18 20:54:43 +00:00
|
|
|
|
2002-01-31 00:31:44 +00:00
|
|
|
switch (code)
|
|
|
|
{
|
|
|
|
case STATUS_KEY_CREATED:
|
|
|
|
if (args && *args)
|
|
|
|
{
|
|
|
|
if (*args == 'B' || *args == 'P')
|
|
|
|
ctx->result.genkey->created_primary = 1;
|
|
|
|
if (*args == 'B' || *args == 'S')
|
|
|
|
ctx->result.genkey->created_sub = 1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2002-02-02 Marcus Brinkmann <marcus@g10code.de>
This patch has gotten a bit large... mmh. The main thing that
happens here is that error values are now not determined in the
operation function after gpgme_wait completed, but in the status
handler when EOF is received. It should always be the case that
either an error is flagged or EOF is received, so that after a
gpgme_wait you should never have the situation that no error is
flagged and EOF is not received. One problem is that the engine
status handlers don't have access to the context, a horrible
kludge works around this for now. All errors that happen during a
pending operation should be catched and reported in ctx->error,
including out-of-core and cancellation. This rounds up neatly a
couple of loose ends, and makes it possible to pass up any errors
in the communication with the backend as well. As a bonus, there
will be a function to access gpgme->wait, so that the operations
can truly be implemented with their _start function.
* engine-gpgsm.c (gpgsm_status_handler): Horrible kludge to report
error back to the context.
* rungpg.c (gpg_status_handler): Same horrible kludge applied here.
* engine-gpgsm.c (gpgsm_assuan_simple_command): Add error checking.
* wait.c (_gpgme_wait_on_condition): If canceled, set CTX->error
to a value indication that.
* verify.c (add_notation): Set error, not out_of_core.
(finish_sig): Likewise.
(gpgme_op_verify_start): Don't clear out_of_core.
(_gpgme_verify_status_handler): At EOF, clean up the notation data.
(gpgme_op_verify): And don't do it here.
* trustlist.c (trustlist_status_handler): Check error, not out_of_core.
(gpgme_op_trustlist_start): Don't clear out_of_core.
(gpgme_op_trustlist_next): Check error, not out_of_core.
(gpgme_op_trustlist_end): Likewise.
* ops.h (test_and_allocate_result): New macro.
(_gpgme_passphrase_result): Remove prototype.
* delete.c (gpgme_op_delete): Return error from context.
(delete_status_handler): Use macro test_and_allocate_result.
Perform error checking at EOF.
(gpgme_op_delete_start): Release result.
* passphrase.c (_gpgme_passphrase_status_handler): Use macro
test_and_allocate_result, and perform error checking here.
(_gpgme_passphrase_result): Function removed.
* sign.c (gpgme_op_sign_start): Do not set out_of_core to zero.
(gpgme_op_sign): Just return the error value from the context.
(sign_status_handler): Only progress if no error is set yet. If
we process an EOF, set the resulting error value (if any).
* decrypt.c (_gpgme_decrypt_result): Function removed.
(create_result_struct): Function removed.
(_gpgme_decrypt_status_handler): Use macro test_and_allocate_result,
caclulate error on EOF, do not progress with errors.
(_gpgme_decrypt_start): Do not set out_of_core to zero.
(gpgme_op_decrypt): Just return the error value from the context.
* encrypt.c (encrypt_status_handler): Perform the error checking
here.
(gpgme_op_encrypt_start): Do not clear out_of_core.
* export.c (export_status_handler): Return if error is set in context.
(gpgme_op_export_start): Release result.
(gpgme_op_export): Return error from context.
* decrypt-verify.c (gpgme_op_decrypt_verify): Return the error in
the context.
* genkey.c (genkey_status_handler): Use macro
test_and_allocate_result. Perform error checking at EOF.
(gpgme_op_genkey): Just return the error from context.
* import.c (gpgme_op_import): Return the error from context.
(import_status_handler): Use macro test_and_allocate_result.
* keylist.c (gpgme_op_keylist_start): Do not clear out_of_core.
(gpgme_op_keylist_next): Return error of context.
(keylist_colon_handler): Set error instead out_of_code.
(finish_key): Likewise.
* context.h: Remove member out_of_core, add member error.
* gpgme.c (_gpgme_release_result): Clear error flag.
* engine.h (_gpgme_engine_get_error): New prototype.
* engine.c (_gpgme_engine_get_error): New function.
* engine-gpgsm.c (_gpgme_gpgsm_get_error): New function.
* engine-gpgsm.c (map_assuan_error): New function.
(gpgsm_assuan_simple_command): Change return type to GpgmeError,
use the new function to map error values.
(gpgsm_set_fd): Change return type tp GpgmeError.
(_gpgme_gpgsm_op_decrypt): Change type of ERR to GpgmeError.
(gpgsm_set_recipients): Likewise. Change type of return value
equivalently. Adjust error values.
(_gpgme_gpgsm_op_import): Likewise.
(_gpgme_gpgsm_op_sign): Likewise.
(struct gpgsm_object_s): New member error.
(gpgsm_status_handler): Set error if error occurs. Determine
error number from ERR line received. If assuan_read_line fails,
terminate the connection.
2002-02-02 03:52:59 +00:00
|
|
|
case STATUS_EOF:
|
|
|
|
/* FIXME: Should return some more useful error value. */
|
|
|
|
if (!ctx->result.genkey->created_primary
|
|
|
|
&& !ctx->result.genkey->created_sub)
|
|
|
|
ctx->error = mk_error (General_Error);
|
|
|
|
break;
|
|
|
|
|
2002-01-31 00:31:44 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-09-17 08:25:36 +00:00
|
|
|
/**
|
|
|
|
* gpgme_op_genkey:
|
|
|
|
* @c: the context
|
|
|
|
* @parms: XML string with the key parameters
|
|
|
|
* @pubkey: Returns the public key
|
|
|
|
* @seckey: Returns the secret key
|
|
|
|
*
|
|
|
|
* Generate a new key and store the key in the default keyrings if
|
|
|
|
* both @pubkey and @seckey are NULL. If @pubkey and @seckey are
|
|
|
|
* given, the newly created key will be returned in these data
|
|
|
|
* objects. This function just starts the gheneration and does not
|
|
|
|
* wait for completion.
|
|
|
|
*
|
|
|
|
* Here is an example on how @parms should be formatted; for deatils
|
|
|
|
* see the file doc/DETAILS from the GnuPG distribution.
|
|
|
|
*
|
|
|
|
* <literal>
|
|
|
|
* <![CDATA[
|
|
|
|
* <GnupgKeyParms format="internal">
|
|
|
|
* Key-Type: DSA
|
|
|
|
* Key-Length: 1024
|
|
|
|
* Subkey-Type: ELG-E
|
|
|
|
* Subkey-Length: 1024
|
|
|
|
* Name-Real: Joe Tester
|
|
|
|
* Name-Comment: with stupid passphrase
|
|
|
|
* Name-Email: joe@foo.bar
|
|
|
|
* Expire-Date: 0
|
|
|
|
* Passphrase: abc
|
|
|
|
* </GnupgKeyParms>
|
|
|
|
* ]]>
|
|
|
|
* </literal>
|
|
|
|
*
|
|
|
|
* Strings should be given in UTF-8 encoding. The format we support
|
|
|
|
* for now is only "internal". The content of the
|
|
|
|
* <GnupgKeyParms> container is passed verbatim to GnuPG.
|
|
|
|
* Control statements are not allowed.
|
|
|
|
*
|
|
|
|
* Return value: 0 for success or an error code
|
|
|
|
**/
|
2000-12-18 20:54:43 +00:00
|
|
|
GpgmeError
|
2001-11-21 03:40:17 +00:00
|
|
|
gpgme_op_genkey_start (GpgmeCtx ctx, const char *parms,
|
|
|
|
GpgmeData pubkey, GpgmeData seckey)
|
2000-12-18 20:54:43 +00:00
|
|
|
{
|
2001-11-21 03:40:17 +00:00
|
|
|
int err = 0;
|
|
|
|
const char *s, *s2, *sx;
|
|
|
|
|
|
|
|
fail_on_pending_request (ctx);
|
|
|
|
ctx->pending = 1;
|
|
|
|
|
|
|
|
gpgme_data_release (ctx->help_data_1);
|
|
|
|
ctx->help_data_1 = NULL;
|
|
|
|
|
|
|
|
_gpgme_engine_release (ctx->engine);
|
|
|
|
ctx->engine = NULL;
|
|
|
|
err = _gpgme_engine_new (ctx->use_cms ? GPGME_PROTOCOL_CMS
|
|
|
|
: GPGME_PROTOCOL_OpenPGP, &ctx->engine);
|
|
|
|
if (err)
|
|
|
|
goto leave;
|
|
|
|
|
|
|
|
/* 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 = mk_error (Not_Implemented);
|
|
|
|
goto leave;
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
|
|
|
|
2001-11-21 03:40:17 +00:00
|
|
|
if (!pubkey && !seckey)
|
|
|
|
; /* okay: Add key to the keyrings */
|
|
|
|
else if (!pubkey || gpgme_data_get_type (pubkey) != GPGME_DATA_TYPE_NONE)
|
|
|
|
{
|
|
|
|
err = mk_error (Invalid_Value);
|
|
|
|
goto leave;
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
2001-11-21 03:40:17 +00:00
|
|
|
else if (!seckey || gpgme_data_get_type (seckey) != GPGME_DATA_TYPE_NONE)
|
|
|
|
{
|
|
|
|
err = mk_error (Invalid_Value);
|
|
|
|
goto leave;
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
|
|
|
|
2001-11-21 03:40:17 +00:00
|
|
|
if (pubkey)
|
|
|
|
{
|
|
|
|
_gpgme_data_set_mode (pubkey, GPGME_DATA_MODE_IN);
|
|
|
|
_gpgme_data_set_mode (seckey, GPGME_DATA_MODE_IN);
|
|
|
|
/* FIXME: Need some more things here. */
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
|
|
|
|
2001-11-21 03:40:17 +00:00
|
|
|
if ((parms = strstr (parms, "<GnupgKeyParms "))
|
|
|
|
&& (s = strchr (parms, '>'))
|
|
|
|
&& (sx = strstr (parms, "format=\"internal\""))
|
|
|
|
&& sx < s
|
|
|
|
&& (s2 = strstr (s+1, "</GnupgKeyParms>")))
|
|
|
|
{
|
|
|
|
/* FIXME: Check that there are no control statements inside. */
|
|
|
|
err = gpgme_data_new_from_mem (&ctx->help_data_1, s+1, s2-s-1, 1);
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
2001-11-21 03:40:17 +00:00
|
|
|
else
|
|
|
|
err = mk_error (Invalid_Value);
|
2000-12-18 20:54:43 +00:00
|
|
|
|
2001-11-21 03:40:17 +00:00
|
|
|
if (err)
|
|
|
|
goto leave;
|
2000-12-18 20:54:43 +00:00
|
|
|
|
2001-11-21 03:40:17 +00:00
|
|
|
_gpgme_data_set_mode (ctx->help_data_1, GPGME_DATA_MODE_OUT);
|
|
|
|
|
|
|
|
_gpgme_engine_set_status_handler (ctx->engine, genkey_status_handler, ctx);
|
|
|
|
_gpgme_engine_set_verbosity (ctx->engine, ctx->verbosity);
|
|
|
|
|
|
|
|
err = _gpgme_engine_op_genkey (ctx->engine, ctx->help_data_1, ctx->use_armor);
|
|
|
|
|
|
|
|
if (!err)
|
|
|
|
err = _gpgme_engine_start (ctx->engine, ctx);
|
2000-12-18 20:54:43 +00:00
|
|
|
|
|
|
|
leave:
|
2001-11-21 03:40:17 +00:00
|
|
|
if (err)
|
|
|
|
{
|
|
|
|
ctx->pending = 0;
|
|
|
|
_gpgme_engine_release (ctx->engine);
|
|
|
|
ctx->engine = NULL;
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
2001-11-21 03:40:17 +00:00
|
|
|
return err;
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|
|
|
|
|
2002-01-31 00:31:44 +00:00
|
|
|
|
2000-12-18 20:54:43 +00:00
|
|
|
/**
|
|
|
|
* gpgme_op_genkey:
|
|
|
|
* @c: the context
|
|
|
|
* @parms: XML string with the key parameters
|
|
|
|
* @pubkey: Returns the public key
|
|
|
|
* @seckey: Returns the secret key
|
|
|
|
*
|
|
|
|
* Generate a new key and store the key in the default keyrings if both
|
|
|
|
* @pubkey and @seckey are NULL. If @pubkey and @seckey are given, the newly
|
|
|
|
* created key will be returned in these data objects.
|
|
|
|
* See gpgme_op_genkey_start() for a description of @parms.
|
|
|
|
*
|
|
|
|
* Return value: 0 for success or an error code
|
|
|
|
**/
|
|
|
|
GpgmeError
|
2002-01-22 15:11:53 +00:00
|
|
|
gpgme_op_genkey (GpgmeCtx ctx, const char *parms,
|
|
|
|
GpgmeData pubkey, GpgmeData seckey)
|
2000-12-18 20:54:43 +00:00
|
|
|
{
|
2002-01-22 15:11:53 +00:00
|
|
|
GpgmeError err = gpgme_op_genkey_start (ctx, parms, pubkey, seckey);
|
|
|
|
if (!err)
|
2002-02-06 01:20:49 +00:00
|
|
|
gpgme_wait (ctx, &err, 1);
|
2002-01-22 15:11:53 +00:00
|
|
|
return err;
|
2000-12-18 20:54:43 +00:00
|
|
|
}
|