C GPGMe игнорирует связку ключей пользователя

Недавно я закончил программу, которая загружает открытые ключи в память, а затем создает зашифрованное сообщение со всеми ними. Однако у меня возникли некоторые трудности с созданием списка только тех ключей, которые я загружаю. При первой загрузке они сохраняются в gpgme_data_t. Мне не удалось найти функцию, которая напрямую преобразовывала бы это в gpgme_key_t. Из-за этого я просто импортировал их в новый контекст. Однако, когда я снова экспортировал ключи, чтобы создать список для gpgme_op_encrypt, я получил другие ключи из моей локальной цепочки для ключей. Я попытался установить disable-gpgconf, но это ничего не изменило. Я также попытался установить GNUPGHOME в каталог tmp, но это вызвало ошибку сегментации, когда я вызвал шифрование. Есть ли способ не импортировать связку ключей пользователя или преобразовать gpgme_data_t или char* в gpgme_key_t?


person 735Tesla    schedule 16.04.2015    source источник


Ответы (1)


Есть ли способ не импортировать связку ключей пользователя

Чтобы предотвратить загрузку набора ключей пользователей, вам нужно установить домашний каталог контекста GnuPG в другое место.

Ниже приведен пример без проверки ошибок

#include <gpgme.h>
#include <locale.h>

int main() {
    gpgme_ctx_t ctx;  // the context
    gpgme_error_t err; // errors
    gpgme_key_t key; // the key
    gpgme_keylist_result_t result; // the keylist results

    setlocale (LC_ALL, ""); // set the locale
    gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL)); // set gpgme locale
    gpgme_check_version(NULL); // initialize gpgme

    gpgme_new (&ctx); // initialize the context

    gpgme_ctx_set_engine_info (ctx, GPGME_PROTOCOL_OpenPGP, NULL, "/tmp/xyz"); // set the context GNUPGHOME to "/tmp/xyz"

    gpgme_op_keylist_start (ctx, NULL, 0); // start the keylist

    while (!(err = gpgme_op_keylist_next (ctx, &key))) { // loop through the keys in the keyring
        fprintf(stdout, "Key ID: %s\n", key->subkeys->keyid); // print out the keyid
        gpgme_key_unref (key); // release the key reference
    }

    gpgme_release(ctx); // release the context, all done

    return 0;
}
person kylehuff    schedule 26.04.2015
comment
gpgme_ctx_set_engine_info (ctx, GPGME_PROTOCOL_OpenPGP, NULL, "/tmp/xyz"); на самом деле ломает его, и без этой строки он работает как обычно - person 735Tesla; 27.04.2015
comment
@735Tesla - Что именно ломается? - person kylehuff; 27.04.2015
comment
Он не производит никакого вывода. Ошибка, которую я получаю, говорит, что она не инициализирована. - person 735Tesla; 27.04.2015
comment
Если вы не импортируете ключи в новую связку ключей, созданную в /tmp/xyz, никакого вывода не будет. Весь смысл в том, чтобы обойти связку ключей пользователя, которая была бы пустой связкой ключей. - person kylehuff; 27.04.2015
comment
ключи импортируются после того, как я уберу все остальные - person 735Tesla; 27.04.2015