aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
authorTobias Fella <[email protected]>2024-01-03 13:21:41 +0000
committerTobias Fella <[email protected]>2024-05-22 08:16:19 +0000
commite42b72bc2ba0b5cacfd5df625df6011b8819fbce (patch)
tree83de7a6e18acf8b6b2dfeae3cb091641076bf711 /src/engine-gpg.c
parenttests: Fix segv in t-json.c (diff)
downloadgpgme-e42b72bc2ba0b5cacfd5df625df6011b8819fbce.tar.gz
gpgme-e42b72bc2ba0b5cacfd5df625df6011b8819fbce.zip
core: Implement adding ADSKs through gpgme_createsubkey
* src/engine-gpg.c: Add and use function for adding ADSKs. * src/genkey.c: Prevent error due to no status line. * src/gpgme.h.in: Add flag GPGME_CREATE_ADSK * doc/gpgme.texi: Add documentation for ADSKs * tests/run-genkey.c: Add test for adding ADSKs -- This adds the ability to add ADSKs through the gpgme_createsubkey interface. The function must be called with NULL userid, the ADSK fingerprint in algo and the GPGME_CREATE_ADSK flag.
Diffstat (limited to 'src/engine-gpg.c')
-rw-r--r--src/engine-gpg.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index d5b2ab71..e212f1f8 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -2856,6 +2856,33 @@ gpg_adduid (engine_gpg_t gpg,
static gpgme_error_t
+gpg_addadsk (engine_gpg_t gpg, gpgme_key_t key, const char *adskfpr)
+{
+ 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,
unsigned long reserved, unsigned long expires,
@@ -2878,6 +2905,8 @@ gpg_genkey (void *engine,
* !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 +2923,12 @@ gpg_genkey (void *engine,
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);