diff options
Diffstat (limited to 'src/pgp')
-rw-r--r-- | src/pgp/gpg.c | 44 | ||||
-rw-r--r-- | src/pgp/gpg.h | 1 |
2 files changed, 45 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; +} diff --git a/src/pgp/gpg.h b/src/pgp/gpg.h index c7ca7e8f..090ec83b 100644 --- a/src/pgp/gpg.h +++ b/src/pgp/gpg.h @@ -79,6 +79,7 @@ char* p_ox_gpg_signcrypt(const char* const sender_barejid, const char* const rec char* p_ox_gpg_decrypt(char* base64); void p_ox_gpg_readkey(const char* const filename, char** key, char** fp); +gboolean p_ox_gpg_import(char* base64_public_key); /*! * \brief List of public keys with xmpp-URI. |