diff options
author | Tobias Fella <[email protected]> | 2024-01-03 13:21:41 +0000 |
---|---|---|
committer | Tobias Fella <[email protected]> | 2024-05-22 08:16:19 +0000 |
commit | e42b72bc2ba0b5cacfd5df625df6011b8819fbce (patch) | |
tree | 83de7a6e18acf8b6b2dfeae3cb091641076bf711 /src/engine-gpg.c | |
parent | tests: Fix segv in t-json.c (diff) | |
download | gpgme-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.c | 33 |
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); |