From e42b72bc2ba0b5cacfd5df625df6011b8819fbce Mon Sep 17 00:00:00 2001 From: Tobias Fella Date: Wed, 3 Jan 2024 14:21:41 +0100 Subject: 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. --- src/engine-gpg.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/engine-gpg.c') 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 @@ -2855,6 +2855,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, @@ -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); -- cgit v1.2.3