Page MenuHome GnuPG

D570.id1548.diff
No OneTemporary

D570.id1548.diff

Index: src/engine-gpg.c
===================================================================
--- src/engine-gpg.c
+++ src/engine-gpg.c
@@ -2855,6 +2855,34 @@
}
+static gpgme_error_t
+gpg_addadsk (engine_gpg_t engine, gpgme_key_t key, const char *adskfpr)
+{
+ engine_gpg_t gpg = engine;
+ gpgme_error_t err;
+
+ if (!key || !key->fpr)
+ return gpg_error (GPG_ERR_INV_ARG);
+
+ if (!adskfpr || !*adskfpr)
+ return gpg_error (GPG_ERR_INV_ARG);
+
+ if (!have_gpg_version (gpg, "2.4.1"))
+ return gpg_error (GPG_ERR_NOT_SUPPORTED);
+
+ err = add_arg (gpg, "--quick-add-adsk");
+ if (!err)
+ err = add_arg (gpg, "--");
+ if (!err)
+ err = add_arg (gpg, key->fpr);
+ if (!err)
+ err = add_arg (gpg, adskfpr);
+ if (!err)
+ err = start (gpg);
+ return err;
+}
+
+
static gpgme_error_t
gpg_genkey (void *engine,
const char *userid, const char *algo,
@@ -2878,6 +2906,8 @@
* !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).
* or set a flag on a user id.
+ * !USERID && KEY && ALGO
+ * && GPGME_CREATE_ADSK - Add ALGO as an ADSK to KEY.
*/
if (help_data)
{
@@ -2894,10 +2924,12 @@
err = gpg_error (GPG_ERR_NOT_SUPPORTED);
else if (userid && !key)
err = gpg_createkey (gpg, userid, algo, expires, flags, extraflags);
- else if (!userid && key)
+ else if (!userid && key && !(flags & GPGME_CREATE_ADSK))
err = gpg_addkey (gpg, algo, expires, key, flags, extraflags);
else if (userid && key && !algo)
err = gpg_adduid (gpg, key, userid, extraflags);
+ else if (!userid && key && algo && (flags & GPGME_CREATE_ADSK))
+ err = gpg_addadsk (gpg, key, algo);
else
err = gpg_error (GPG_ERR_INV_VALUE);
Index: src/genkey.c
===================================================================
--- src/genkey.c
+++ src/genkey.c
@@ -48,6 +48,9 @@
/* The key parameters passed to the crypto engine. */
gpgme_data_t key_parameter;
+
+ /* Flag to indicate that an ADSK is to be added. */
+ unsigned int adskmode : 1;
} *op_data_t;
@@ -180,7 +183,7 @@
case GPGME_STATUS_EOF:
if (opd->error_code)
return opd->error_code;
- else if (!opd->uidmode && !opd->result.primary && !opd->result.sub)
+ else if (!opd->uidmode && !opd->adskmode && !opd->result.primary && !opd->result.sub)
return gpg_error (GPG_ERR_GENERAL);
else if (opd->failure_code)
return opd->failure_code;
@@ -445,6 +448,9 @@
return err;
}
+ if (flags & GPGME_CREATE_ADSK)
+ opd->adskmode = 1;
+
return _gpgme_engine_op_genkey (ctx->engine,
NULL, algo, reserved, expires,
key, flags,
Index: src/gpgme.h.in
===================================================================
--- src/gpgme.h.in
+++ src/gpgme.h.in
@@ -1838,6 +1838,7 @@
#define GPGME_CREATE_WANTSEC (1 << 11) /* Return the secret key. */
#define GPGME_CREATE_FORCE (1 << 12) /* Force creation. */
#define GPGME_CREATE_NOEXPIRE (1 << 13) /* Create w/o expiration. */
+#define GPGME_CREATE_ADSK (1 << 14) /* Add an ADSK */
/* An object to return result from a key generation.

File Metadata

Mime Type
text/plain
Expires
Tue, Aug 5, 8:58 PM (13 h, 23 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
66/9c/971b44e102879e74a073049b7d90

Event Timeline