about summary refs log tree commit diff stats
path: root/src/pgp/gpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pgp/gpg.c')
-rw-r--r--src/pgp/gpg.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/pgp/gpg.c b/src/pgp/gpg.c
index ca70367a..7be1e5c9 100644
--- a/src/pgp/gpg.c
+++ b/src/pgp/gpg.c
@@ -1304,3 +1304,47 @@ p_ox_gpg_readkey(const char* const filename, char** key, char** fp)
         log_error("Read OpenPGP key from file: Unable to read file: %s", error->message);
     }
 }
+
+gboolean
+p_ox_gpg_import(char* base64_public_key)
+{
+    gsize size = -1;
+    guchar* key = g_base64_decode(base64_public_key, &size);
+
+    setlocale(LC_ALL, "");
+    gpgme_check_version(NULL);
+    gpgme_set_locale(NULL, LC_CTYPE, setlocale(LC_CTYPE, NULL));
+    gpgme_ctx_t ctx;
+    gpgme_error_t error = gpgme_new(&ctx);
+
+    if (GPG_ERR_NO_ERROR != error) {
+        log_error("Read OpenPGP key from file: gpgme_new failed: %s", gpgme_strerror(error));
+        return FALSE;
+    }
+
+    error = gpgme_set_protocol(ctx, GPGME_PROTOCOL_OPENPGP);
+    if (error != GPG_ERR_NO_ERROR) {
+        log_error("Read OpenPGP key from file: set GPGME_PROTOCOL_OPENPGP:  %s", gpgme_strerror(error));
+        return FALSE;
+    }
+
+    gpgme_set_armor(ctx, 0);
+    gpgme_set_textmode(ctx, 0);
+    gpgme_set_offline(ctx, 1);
+    gpgme_set_keylist_mode(ctx, GPGME_KEYLIST_MODE_LOCAL);
+
+    gpgme_data_t gpgme_data = NULL;
+    error = gpgme_data_new(&gpgme_data);
+    if (error != GPG_ERR_NO_ERROR) {
+        log_error("Read OpenPGP key from file: gpgme_data_new %s", gpgme_strerror(error));
+        return FALSE;
+    }
+
+    gpgme_data_new_from_mem(&gpgme_data, (gchar*)key, size, 0);
+    error = gpgme_op_import(ctx, gpgme_data);
+    if (error != GPG_ERR_NO_ERROR) {
+        log_error("Failed to import key");
+    }
+
+    return TRUE;
+}